<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/arch/x86/include/asm/processor.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/arch/x86/include/asm/processor.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="Maybe">       1:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_X0FTTV9YODZfUFJPQ0VTU09SX0hfMA__"><span class="b">_ASM_X86_PROCESSOR_H</span></a>
<a name="2" /><span class="Maybe">       2:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X0FTTV9YODZfUFJPQ0VTU09SX0hfMA__"><span class="b">_ASM_X86_PROCESSOR_H</span></a>
<a name="3" /><span class="Maybe">       3:</span> 
<a name="4" /><span class="Maybe">       4:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">processor</span><span class="f">-</span><span class="b">flags</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="5" /><span class="Maybe">       5:</span> 
<a name="6" /><span class="Maybe">       6:</span> <span class="k">/* Forward declaration, a strange C thing */</span>
<a name="7" /><span class="Maybe">       7:</span> <span class="m">struct</span> <span class="b">task_struct</span><span class="f">;</span>
<a name="8" /><span class="Maybe">       8:</span> <span class="m">struct</span> <span class="b">mm_struct</span><span class="f">;</span>
<a name="9" /><span class="Maybe">       9:</span> 
<a name="10" /><span class="Maybe">      10:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">vm86</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="11" /><span class="Maybe">      11:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">math_emu</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="12" /><span class="Maybe">      12:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">segment</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="13" /><span class="Maybe">      13:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">types</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="14" /><span class="Maybe">      14:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">sigcontext</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="15" /><span class="Maybe">      15:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><a href="cpu.c_macros_ref.html#_Y3VycmVudF8w"><span class="b">current</span></a><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="16" /><span class="Maybe">      16:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">cpufeature</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="17" /><span class="Maybe">      17:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">page</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="18" /><span class="Maybe">      18:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">pgtable_types</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="19" /><span class="Maybe">      19:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">percpu</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="20" /><span class="Maybe">      20:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">msr</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="21" /><span class="Maybe">      21:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">desc_defs</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="22" /><span class="Maybe">      22:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">nops</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="23" /><span class="Maybe">      23:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">special_insns</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="24" /><span class="Maybe">      24:</span> 
<a name="25" /><span class="Maybe">      25:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><a href="cpu.c_macros_noref.html#_cGVyc29uYWxpdHlfMA__"><span class="b">personality</span></a><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="26" /><span class="Maybe">      26:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">cpumask</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="27" /><span class="Maybe">      27:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">cache</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="28" /><span class="Maybe">      28:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">threads</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="29" /><span class="Maybe">      29:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">math64</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="30" /><span class="Maybe">      30:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">init</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="31" /><span class="Maybe">      31:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">err</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="32" /><span class="Maybe">      32:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">irqflags</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="33" /><span class="Maybe">      33:</span> 
<a name="34" /><span class="Maybe">      34:</span> <span class="k">/*</span>
<a name="35" /><span class="Maybe">      35:</span> <span class="k"> * We handle most unaligned accesses in hardware.  On the other hand</span>
<a name="36" /><span class="Maybe">      36:</span> <span class="k"> * unaligned DMA can be quite expensive on some Nehalem processors.</span>
<a name="37" /><span class="Maybe">      37:</span> <span class="k"> *</span>
<a name="38" /><span class="Maybe">      38:</span> <span class="k"> * Based on this we disable the IP header alignment in network drivers.</span>
<a name="39" /><span class="Maybe">      39:</span> <span class="k"> */</span>
<a name="40" /><span class="Maybe">      40:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_TkVUX0lQX0FMSUdOXzA_"><span class="b">NET_IP_ALIGN</span></a>    <span class="c">0</span>
<a name="41" /><span class="Maybe">      41:</span> 
<a name="42" /><span class="Maybe">      42:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_SEJQX05VTV8w"><span class="b">HBP_NUM</span></a> <span class="c">4</span>
<a name="43" /><span class="Maybe">      43:</span> <span class="k">/*</span>
<a name="44" /><span class="Maybe">      44:</span> <span class="k"> * Default implementation of macro that returns current</span>
<a name="45" /><span class="Maybe">      45:</span> <span class="k"> * instruction pointer (&quot;program counter&quot;).</span>
<a name="46" /><span class="Maybe">      46:</span> <span class="k"> */</span>
<a name="47" /><span class="Maybe">      47:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="f">*</span><span class="b">current_text_addr</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="48" /><span class="Maybe">      48:</span> <span class="f">{</span>
<a name="49" /><span class="Maybe">      49:</span>     <span class="m">void</span> <span class="f">*</span><span class="b">pc</span><span class="f">;</span>
<a name="50" /><span class="Maybe">      50:</span> 
<a name="51" /><span class="Maybe">      51:</span>     <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><span class="e">&quot;mov $1f, %0; 1:&quot;</span><span class="f">:</span><span class="e">&quot;=r&quot;</span> <span class="f">(</span><span class="b">pc</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="52" /><span class="Maybe">      52:</span> 
<a name="53" /><span class="Maybe">      53:</span>     <span class="m">return</span> <span class="b">pc</span><span class="f">;</span>
<a name="54" /><span class="Maybe">      54:</span> <span class="f">}</span>
<a name="55" /><span class="Maybe">      55:</span> 
<a name="56" /><span class="False">      56:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_X86_VSMP</span>
<a name="57" /><span class="False">      57:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_QVJDSF9NSU5fVEFTS0FMSUdOXzA_"><span class="b">ARCH_MIN_TASKALIGN</span></a>        <span class="f">(</span><span class="c">1</span> <span class="f">&lt;&lt;</span> <a href="cpu.c_macros_ref.html#_SU5URVJOT0RFX0NBQ0hFX1NISUZUXzA_"><span class="b">INTERNODE_CACHE_SHIFT</span></a><span class="f">)</span>
<a name="58" /><span class="False">      58:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_QVJDSF9NSU5fTU1TVFJVQ1RfQUxJR05fMA__"><span class="b">ARCH_MIN_MMSTRUCT_ALIGN</span></a>    <span class="f">(</span><span class="c">1</span> <span class="f">&lt;&lt;</span> <a href="cpu.c_macros_ref.html#_SU5URVJOT0RFX0NBQ0hFX1NISUZUXzA_"><span class="b">INTERNODE_CACHE_SHIFT</span></a><span class="f">)</span>
<a name="59" /><span class="Maybe">      59:</span> <span class="f">#</span><span class="n">else</span>
<a name="60" /><span class="Maybe">      60:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_QVJDSF9NSU5fVEFTS0FMSUdOXzA_"><span class="b">ARCH_MIN_TASKALIGN</span></a>        <span class="c">16</span>
<a name="61" /><span class="Maybe">      61:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_QVJDSF9NSU5fTU1TVFJVQ1RfQUxJR05fMA__"><span class="b">ARCH_MIN_MMSTRUCT_ALIGN</span></a>    <span class="c">0</span>
<a name="62" /><span class="Maybe">      62:</span> <span class="f">#</span><span class="n">endif</span>
<a name="63" /><span class="Maybe">      63:</span> 
<a name="64" /><span class="Maybe">      64:</span> <span class="m">enum</span> <span class="b">tlb_infos</span> <span class="f">{</span>
<a name="65" /><span class="Maybe">      65:</span>     <span class="b">ENTRIES</span><span class="f">,</span>
<a name="66" /><span class="Maybe">      66:</span>     <span class="b">NR_INFO</span>
<a name="67" /><span class="Maybe">      67:</span> <span class="f">}</span><span class="f">;</span>
<a name="68" /><span class="Maybe">      68:</span> 
<a name="69" /><span class="Maybe">      69:</span> <span class="m">extern</span> <span class="b">u16</span> <a href="cpu.c_macros_ref.html#_X19yZWFkX21vc3RseV8w"><span class="b">__read_mostly</span></a> <span class="b">tlb_lli_4k</span><span class="f">[</span><span class="b">NR_INFO</span><span class="f">]</span><span class="f">;</span>
<a name="70" /><span class="Maybe">      70:</span> <span class="m">extern</span> <span class="b">u16</span> <a href="cpu.c_macros_ref.html#_X19yZWFkX21vc3RseV8w"><span class="b">__read_mostly</span></a> <span class="b">tlb_lli_2m</span><span class="f">[</span><span class="b">NR_INFO</span><span class="f">]</span><span class="f">;</span>
<a name="71" /><span class="Maybe">      71:</span> <span class="m">extern</span> <span class="b">u16</span> <a href="cpu.c_macros_ref.html#_X19yZWFkX21vc3RseV8w"><span class="b">__read_mostly</span></a> <span class="b">tlb_lli_4m</span><span class="f">[</span><span class="b">NR_INFO</span><span class="f">]</span><span class="f">;</span>
<a name="72" /><span class="Maybe">      72:</span> <span class="m">extern</span> <span class="b">u16</span> <a href="cpu.c_macros_ref.html#_X19yZWFkX21vc3RseV8w"><span class="b">__read_mostly</span></a> <span class="b">tlb_lld_4k</span><span class="f">[</span><span class="b">NR_INFO</span><span class="f">]</span><span class="f">;</span>
<a name="73" /><span class="Maybe">      73:</span> <span class="m">extern</span> <span class="b">u16</span> <a href="cpu.c_macros_ref.html#_X19yZWFkX21vc3RseV8w"><span class="b">__read_mostly</span></a> <span class="b">tlb_lld_2m</span><span class="f">[</span><span class="b">NR_INFO</span><span class="f">]</span><span class="f">;</span>
<a name="74" /><span class="Maybe">      74:</span> <span class="m">extern</span> <span class="b">u16</span> <a href="cpu.c_macros_ref.html#_X19yZWFkX21vc3RseV8w"><span class="b">__read_mostly</span></a> <span class="b">tlb_lld_4m</span><span class="f">[</span><span class="b">NR_INFO</span><span class="f">]</span><span class="f">;</span>
<a name="75" /><span class="Maybe">      75:</span> <span class="m">extern</span> <span class="b">s8</span>  <a href="cpu.c_macros_ref.html#_X19yZWFkX21vc3RseV8w"><span class="b">__read_mostly</span></a> <span class="b">tlb_flushall_shift</span><span class="f">;</span>
<a name="76" /><span class="Maybe">      76:</span> 
<a name="77" /><span class="Maybe">      77:</span> <span class="k">/*</span>
<a name="78" /><span class="Maybe">      78:</span> <span class="k"> *  CPU type and hardware bug flags. Kept separately for each CPU.</span>
<a name="79" /><span class="Maybe">      79:</span> <span class="k"> *  Members of this structure are referenced in head.S, so think twice</span>
<a name="80" /><span class="Maybe">      80:</span> <span class="k"> *  before touching them. [mj]</span>
<a name="81" /><span class="Maybe">      81:</span> <span class="k"> */</span>
<a name="82" /><span class="Maybe">      82:</span> 
<a name="83" /><span class="Maybe">      83:</span> <span class="m">struct</span> <span class="b">cpuinfo_x86</span> <span class="f">{</span>
<a name="84" /><span class="Maybe">      84:</span>     <span class="b">__u8</span>            <span class="b">x86</span><span class="f">;</span>        <span class="k">/* CPU family */</span>
<a name="85" /><span class="Maybe">      85:</span>     <span class="b">__u8</span>            <span class="b">x86_vendor</span><span class="f">;</span>    <span class="k">/* CPU vendor */</span>
<a name="86" /><span class="Maybe">      86:</span>     <span class="b">__u8</span>            <span class="b">x86_model</span><span class="f">;</span>
<a name="87" /><span class="Maybe">      87:</span>     <span class="b">__u8</span>            <span class="b">x86_mask</span><span class="f">;</span>
<a name="88" /><span class="False">      88:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_X86_32</span>
<a name="89" /><span class="False">      89:</span>     <span class="m">char</span>            <span class="b">wp_works_ok</span><span class="f">;</span>    <span class="k">/* It doesn&apos;t on 386&apos;s */</span>
<a name="90" /><span class="False">      90:</span> 
<a name="91" /><span class="False">      91:</span>     <span class="k">/* Problems on some 486Dx4&apos;s and old 386&apos;s: */</span>
<a name="92" /><span class="False">      92:</span>     <span class="m">char</span>            <span class="b">rfu</span><span class="f">;</span>
<a name="93" /><span class="False">      93:</span>     <span class="m">char</span>            <span class="b">pad0</span><span class="f">;</span>
<a name="94" /><span class="False">      94:</span>     <span class="m">char</span>            <span class="b">pad1</span><span class="f">;</span>
<a name="95" /><span class="Maybe">      95:</span> <span class="f">#</span><span class="n">else</span>
<a name="96" /><span class="Maybe">      96:</span>     <span class="k">/* Number of 4K pages in DTLB/ITLB combined(in pages): */</span>
<a name="97" /><span class="Maybe">      97:</span>     <span class="m">int</span>            <span class="b">x86_tlbsize</span><span class="f">;</span>
<a name="98" /><span class="Maybe">      98:</span> <span class="f">#</span><span class="n">endif</span>
<a name="99" /><span class="Maybe">      99:</span>     <span class="b">__u8</span>            <span class="b">x86_virt_bits</span><span class="f">;</span>
<a name="100" /><span class="Maybe">     100:</span>     <span class="b">__u8</span>            <span class="b">x86_phys_bits</span><span class="f">;</span>
<a name="101" /><span class="Maybe">     101:</span>     <span class="k">/* CPUID returned core id bits: */</span>
<a name="102" /><span class="Maybe">     102:</span>     <span class="b">__u8</span>            <span class="b">x86_coreid_bits</span><span class="f">;</span>
<a name="103" /><span class="Maybe">     103:</span>     <span class="k">/* Max extended CPUID function supported: */</span>
<a name="104" /><span class="Maybe">     104:</span>     <span class="b">__u32</span>            <span class="b">extended_cpuid_level</span><span class="f">;</span>
<a name="105" /><span class="Maybe">     105:</span>     <span class="k">/* Maximum supported CPUID level, -1=no CPUID: */</span>
<a name="106" /><span class="Maybe">     106:</span>     <span class="m">int</span>            <span class="b">cpuid_level</span><span class="f">;</span>
<a name="107" /><span class="Maybe">     107:</span>     <span class="b">__u32</span>            <span class="b">x86_capability</span><span class="f">[</span><a href="cpu.c_macros_ref.html#_TkNBUElOVFNfMA__"><span class="b">NCAPINTS</span></a> <span class="f">+</span> <a href="cpu.c_macros_ref.html#_TkJVR0lOVFNfMA__"><span class="b">NBUGINTS</span></a><span class="f">]</span><span class="f">;</span>
<a name="108" /><span class="Maybe">     108:</span>     <span class="m">char</span>            <span class="b">x86_vendor_id</span><span class="f">[</span><span class="c">16</span><span class="f">]</span><span class="f">;</span>
<a name="109" /><span class="Maybe">     109:</span>     <span class="m">char</span>            <span class="b">x86_model_id</span><span class="f">[</span><span class="c">64</span><span class="f">]</span><span class="f">;</span>
<a name="110" /><span class="Maybe">     110:</span>     <span class="k">/* in KB - valid for CPUS which support this call: */</span>
<a name="111" /><span class="Maybe">     111:</span>     <span class="m">int</span>            <span class="b">x86_cache_size</span><span class="f">;</span>
<a name="112" /><span class="Maybe">     112:</span>     <span class="m">int</span>            <span class="b">x86_cache_alignment</span><span class="f">;</span>    <span class="k">/* In bytes */</span>
<a name="113" /><span class="Maybe">     113:</span>     <span class="m">int</span>            <span class="b">x86_power</span><span class="f">;</span>
<a name="114" /><span class="Maybe">     114:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">loops_per_jiffy</span><span class="f">;</span>
<a name="115" /><span class="Maybe">     115:</span>     <span class="k">/* cpuid returned max cores value: */</span>
<a name="116" /><span class="Maybe">     116:</span>     <span class="b">u16</span>             <span class="b">x86_max_cores</span><span class="f">;</span>
<a name="117" /><span class="Maybe">     117:</span>     <span class="b">u16</span>            <span class="b">apicid</span><span class="f">;</span>
<a name="118" /><span class="Maybe">     118:</span>     <span class="b">u16</span>            <span class="b">initial_apicid</span><span class="f">;</span>
<a name="119" /><span class="Maybe">     119:</span>     <span class="b">u16</span>            <span class="b">x86_clflush_size</span><span class="f">;</span>
<a name="120" /><span class="Maybe">     120:</span>     <span class="k">/* number of cores as seen by the OS: */</span>
<a name="121" /><span class="Maybe">     121:</span>     <span class="b">u16</span>            <span class="b">booted_cores</span><span class="f">;</span>
<a name="122" /><span class="Maybe">     122:</span>     <span class="k">/* Physical processor id: */</span>
<a name="123" /><span class="Maybe">     123:</span>     <span class="b">u16</span>            <span class="b">phys_proc_id</span><span class="f">;</span>
<a name="124" /><span class="Maybe">     124:</span>     <span class="k">/* Core id: */</span>
<a name="125" /><span class="Maybe">     125:</span>     <span class="b">u16</span>            <span class="b">cpu_core_id</span><span class="f">;</span>
<a name="126" /><span class="Maybe">     126:</span>     <span class="k">/* Compute unit id */</span>
<a name="127" /><span class="Maybe">     127:</span>     <span class="b">u8</span>            <span class="b">compute_unit_id</span><span class="f">;</span>
<a name="128" /><span class="Maybe">     128:</span>     <span class="k">/* Index into per_cpu list: */</span>
<a name="129" /><span class="Maybe">     129:</span>     <span class="b">u16</span>            <span class="b">cpu_index</span><span class="f">;</span>
<a name="130" /><span class="Maybe">     130:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">microcode</span><span class="f">;</span>
<a name="131" /><span class="Maybe">     131:</span> <span class="f">}</span> <span class="b">__attribute__</span><span class="f">(</span><span class="f">(</span><span class="b">__aligned__</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_U01QX0NBQ0hFX0JZVEVTXzA_"><span class="b">SMP_CACHE_BYTES</span></a><span class="f">)</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="132" /><span class="Maybe">     132:</span> 
<a name="133" /><span class="Maybe">     133:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_WDg2X1ZFTkRPUl9JTlRFTF8w"><span class="b">X86_VENDOR_INTEL</span></a>    <span class="c">0</span>
<a name="134" /><span class="Maybe">     134:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_WDg2X1ZFTkRPUl9DWVJJWF8w"><span class="b">X86_VENDOR_CYRIX</span></a>    <span class="c">1</span>
<a name="135" /><span class="Maybe">     135:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_WDg2X1ZFTkRPUl9BTURfMA__"><span class="b">X86_VENDOR_AMD</span></a>        <span class="c">2</span>
<a name="136" /><span class="Maybe">     136:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_WDg2X1ZFTkRPUl9VTUNfMA__"><span class="b">X86_VENDOR_UMC</span></a>        <span class="c">3</span>
<a name="137" /><span class="Maybe">     137:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_WDg2X1ZFTkRPUl9DRU5UQVVSXzA_"><span class="b">X86_VENDOR_CENTAUR</span></a>    <span class="c">5</span>
<a name="138" /><span class="Maybe">     138:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_WDg2X1ZFTkRPUl9UUkFOU01FVEFfMA__"><span class="b">X86_VENDOR_TRANSMETA</span></a>    <span class="c">7</span>
<a name="139" /><span class="Maybe">     139:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_WDg2X1ZFTkRPUl9OU0NfMA__"><span class="b">X86_VENDOR_NSC</span></a>        <span class="c">8</span>
<a name="140" /><span class="Maybe">     140:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_WDg2X1ZFTkRPUl9OVU1fMA__"><span class="b">X86_VENDOR_NUM</span></a>        <span class="c">9</span>
<a name="141" /><span class="Maybe">     141:</span> 
<a name="142" /><span class="Maybe">     142:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_WDg2X1ZFTkRPUl9VTktOT1dOXzA_"><span class="b">X86_VENDOR_UNKNOWN</span></a>    <span class="c">0xff</span>
<a name="143" /><span class="Maybe">     143:</span> 
<a name="144" /><span class="Maybe">     144:</span> <span class="k">/*</span>
<a name="145" /><span class="Maybe">     145:</span> <span class="k"> * capabilities of CPUs</span>
<a name="146" /><span class="Maybe">     146:</span> <span class="k"> */</span>
<a name="147" /><span class="Maybe">     147:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">cpuinfo_x86</span>    <span class="b">boot_cpu_data</span><span class="f">;</span>
<a name="148" /><span class="Maybe">     148:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">cpuinfo_x86</span>    <span class="b">new_cpu_data</span><span class="f">;</span>
<a name="149" /><span class="Maybe">     149:</span> 
<a name="150" /><span class="Maybe">     150:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">tss_struct</span>    <span class="b">doublefault_tss</span><span class="f">;</span>
<a name="151" /><span class="Maybe">     151:</span> <span class="m">extern</span> <span class="b">__u32</span>            <span class="b">cpu_caps_cleared</span><span class="f">[</span><a href="cpu.c_macros_ref.html#_TkNBUElOVFNfMA__"><span class="b">NCAPINTS</span></a><span class="f">]</span><span class="f">;</span>
<a name="152" /><span class="Maybe">     152:</span> <span class="m">extern</span> <span class="b">__u32</span>            <span class="b">cpu_caps_set</span><span class="f">[</span><a href="cpu.c_macros_ref.html#_TkNBUElOVFNfMA__"><span class="b">NCAPINTS</span></a><span class="f">]</span><span class="f">;</span>
<a name="153" /><span class="Maybe">     153:</span> 
<a name="154" /><span class="Maybe">     154:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1NNUF8w"><span class="b">CONFIG_SMP</span></a>
<a name="155" /><span class="Maybe">     155:</span> <a href="cpu.c_macros_ref.html#_REVDTEFSRV9QRVJfQ1BVX1NIQVJFRF9BTElHTkVEXzA_"><span class="b">DECLARE_PER_CPU_SHARED_ALIGNED</span></a><span class="f">(</span><span class="m">struct</span> <span class="b">cpuinfo_x86</span><span class="f">,</span> <span class="b">cpu_info</span><span class="f">)</span><span class="f">;</span>
<a name="156" /><span class="Maybe">     156:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_Y3B1X2RhdGFfMA__"><span class="b">cpu_data</span></a><span class="f">(</span><span class="b">cpu</span><span class="f">)</span>        <a href="cpu.c_macros_ref.html#_cGVyX2NwdV8w"><span class="b">per_cpu</span></a><span class="f">(</span><span class="b">cpu_info</span><span class="f">,</span> <span class="b">cpu</span><span class="f">)</span>
<a name="157" /><span class="False">     157:</span> <span class="f">#</span><span class="n">else</span>
<a name="158" /><span class="False">     158:</span> <span class="f">#</span><span class="n">define</span> <span class="b">cpu_info</span>        <span class="b">boot_cpu_data</span>
<a name="159" /><span class="False">     159:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_Y3B1X2RhdGFfMA__"><span class="b">cpu_data</span></a><span class="f">(</span><span class="b">cpu</span><span class="f">)</span>        <span class="b">boot_cpu_data</span>
<a name="160" /><span class="Maybe">     160:</span> <span class="f">#</span><span class="n">endif</span>
<a name="161" /><span class="Maybe">     161:</span> 
<a name="162" /><span class="Maybe">     162:</span> <span class="m">extern</span> <span class="m">const</span> <span class="m">struct</span> <span class="b">seq_operations</span> <span class="b">cpuinfo_op</span><span class="f">;</span>
<a name="163" /><span class="Maybe">     163:</span> 
<a name="164" /><span class="Maybe">     164:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Y2FjaGVfbGluZV9zaXplXzA_"><span class="b">cache_line_size</span></a><span class="f">(</span><span class="f">)</span>    <span class="f">(</span><span class="b">boot_cpu_data</span><span class="f">.</span><span class="b">x86_cache_alignment</span><span class="f">)</span>
<a name="165" /><span class="Maybe">     165:</span> 
<a name="166" /><span class="Maybe">     166:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">cpu_detect</span><span class="f">(</span><span class="m">struct</span> <span class="b">cpuinfo_x86</span> <span class="f">*</span><span class="b">c</span><span class="f">)</span><span class="f">;</span>
<a name="167" /><span class="Maybe">     167:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">fpu_detect</span><span class="f">(</span><span class="m">struct</span> <span class="b">cpuinfo_x86</span> <span class="f">*</span><span class="b">c</span><span class="f">)</span><span class="f">;</span>
<a name="168" /><span class="Maybe">     168:</span> 
<a name="169" /><span class="Maybe">     169:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">early_cpu_init</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="170" /><span class="Maybe">     170:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">identify_boot_cpu</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="171" /><span class="Maybe">     171:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">identify_secondary_cpu</span><span class="f">(</span><span class="m">struct</span> <span class="b">cpuinfo_x86</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="172" /><span class="Maybe">     172:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">print_cpu_info</span><span class="f">(</span><span class="m">struct</span> <span class="b">cpuinfo_x86</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="173" /><span class="Maybe">     173:</span> <span class="m">void</span> <span class="b">print_cpu_msr</span><span class="f">(</span><span class="m">struct</span> <span class="b">cpuinfo_x86</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="174" /><span class="Maybe">     174:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">init_scattered_cpuid_features</span><span class="f">(</span><span class="m">struct</span> <span class="b">cpuinfo_x86</span> <span class="f">*</span><span class="b">c</span><span class="f">)</span><span class="f">;</span>
<a name="175" /><span class="Maybe">     175:</span> <span class="m">extern</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">init_intel_cacheinfo</span><span class="f">(</span><span class="m">struct</span> <span class="b">cpuinfo_x86</span> <span class="f">*</span><span class="b">c</span><span class="f">)</span><span class="f">;</span>
<a name="176" /><span class="Maybe">     176:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">init_amd_cacheinfo</span><span class="f">(</span><span class="m">struct</span> <span class="b">cpuinfo_x86</span> <span class="f">*</span><span class="b">c</span><span class="f">)</span><span class="f">;</span>
<a name="177" /><span class="Maybe">     177:</span> 
<a name="178" /><span class="Maybe">     178:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">detect_extended_topology</span><span class="f">(</span><span class="m">struct</span> <span class="b">cpuinfo_x86</span> <span class="f">*</span><span class="b">c</span><span class="f">)</span><span class="f">;</span>
<a name="179" /><span class="Maybe">     179:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">detect_ht</span><span class="f">(</span><span class="m">struct</span> <span class="b">cpuinfo_x86</span> <span class="f">*</span><span class="b">c</span><span class="f">)</span><span class="f">;</span>
<a name="180" /><span class="Maybe">     180:</span> 
<a name="181" /><span class="False">     181:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_X86_32</span>
<a name="182" /><span class="False">     182:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">have_cpuid_p</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="183" /><span class="Maybe">     183:</span> <span class="f">#</span><span class="n">else</span>
<a name="184" /><span class="Maybe">     184:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">have_cpuid_p</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="185" /><span class="Maybe">     185:</span> <span class="f">{</span>
<a name="186" /><span class="Maybe">     186:</span>     <span class="m">return</span> <span class="c">1</span><span class="f">;</span>
<a name="187" /><span class="Maybe">     187:</span> <span class="f">}</span>
<a name="188" /><span class="Maybe">     188:</span> <span class="f">#</span><span class="n">endif</span>
<a name="189" /><span class="Maybe">     189:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">native_cpuid</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="f">*</span><span class="b">eax</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="f">*</span><span class="b">ebx</span><span class="f">,</span>
<a name="190" /><span class="Maybe">     190:</span>                 <span class="m">unsigned</span> <span class="m">int</span> <span class="f">*</span><span class="b">ecx</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="f">*</span><span class="b">edx</span><span class="f">)</span>
<a name="191" /><span class="Maybe">     191:</span> <span class="f">{</span>
<a name="192" /><span class="Maybe">     192:</span>     <span class="k">/* ecx is often an input as well as an output. */</span>
<a name="193" /><span class="Maybe">     193:</span>     <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><span class="e">&quot;cpuid&quot;</span>
<a name="194" /><span class="Maybe">     194:</span>         <span class="f">:</span> <span class="e">&quot;=a&quot;</span> <span class="f">(</span><span class="f">*</span><span class="b">eax</span><span class="f">)</span><span class="f">,</span>
<a name="195" /><span class="Maybe">     195:</span>           <span class="e">&quot;=b&quot;</span> <span class="f">(</span><span class="f">*</span><span class="b">ebx</span><span class="f">)</span><span class="f">,</span>
<a name="196" /><span class="Maybe">     196:</span>           <span class="e">&quot;=c&quot;</span> <span class="f">(</span><span class="f">*</span><span class="b">ecx</span><span class="f">)</span><span class="f">,</span>
<a name="197" /><span class="Maybe">     197:</span>           <span class="e">&quot;=d&quot;</span> <span class="f">(</span><span class="f">*</span><span class="b">edx</span><span class="f">)</span>
<a name="198" /><span class="Maybe">     198:</span>         <span class="f">:</span> <span class="e">&quot;0&quot;</span> <span class="f">(</span><span class="f">*</span><span class="b">eax</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;2&quot;</span> <span class="f">(</span><span class="f">*</span><span class="b">ecx</span><span class="f">)</span>
<a name="199" /><span class="Maybe">     199:</span>         <span class="f">:</span> <span class="e">&quot;memory&quot;</span><span class="f">)</span><span class="f">;</span>
<a name="200" /><span class="Maybe">     200:</span> <span class="f">}</span>
<a name="201" /><span class="Maybe">     201:</span> 
<a name="202" /><span class="Maybe">     202:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">load_cr3</span><span class="f">(</span><span class="b">pgd_t</span> <span class="f">*</span><span class="b">pgdir</span><span class="f">)</span>
<a name="203" /><span class="Maybe">     203:</span> <span class="f">{</span>
<a name="204" /><span class="Maybe">     204:</span>     <span class="b">write_cr3</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_X19wYV8w"><span class="b">__pa</span></a><span class="f">(</span><span class="b">pgdir</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="205" /><span class="Maybe">     205:</span> <span class="f">}</span>
<a name="206" /><span class="Maybe">     206:</span> 
<a name="207" /><span class="False">     207:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_X86_32</span>
<a name="208" /><span class="False">     208:</span> <span class="k">/* This is the TSS defined by the hardware. */</span>
<a name="209" /><span class="False">     209:</span> <span class="m">struct</span> <span class="b">x86_hw_tss</span> <span class="f">{</span>
<a name="210" /><span class="False">     210:</span>     <span class="m">unsigned</span> <span class="m">short</span>        <span class="b">back_link</span><span class="f">,</span> <span class="b">__blh</span><span class="f">;</span>
<a name="211" /><span class="False">     211:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">sp0</span><span class="f">;</span>
<a name="212" /><span class="False">     212:</span>     <span class="m">unsigned</span> <span class="m">short</span>        <span class="b">ss0</span><span class="f">,</span> <span class="b">__ss0h</span><span class="f">;</span>
<a name="213" /><span class="False">     213:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">sp1</span><span class="f">;</span>
<a name="214" /><span class="False">     214:</span>     <span class="k">/* ss1 caches MSR_IA32_SYSENTER_CS: */</span>
<a name="215" /><span class="False">     215:</span>     <span class="m">unsigned</span> <span class="m">short</span>        <span class="b">ss1</span><span class="f">,</span> <span class="b">__ss1h</span><span class="f">;</span>
<a name="216" /><span class="False">     216:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">sp2</span><span class="f">;</span>
<a name="217" /><span class="False">     217:</span>     <span class="m">unsigned</span> <span class="m">short</span>        <span class="b">ss2</span><span class="f">,</span> <span class="b">__ss2h</span><span class="f">;</span>
<a name="218" /><span class="False">     218:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">__cr3</span><span class="f">;</span>
<a name="219" /><span class="False">     219:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">ip</span><span class="f">;</span>
<a name="220" /><span class="False">     220:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">flags</span><span class="f">;</span>
<a name="221" /><span class="False">     221:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">ax</span><span class="f">;</span>
<a name="222" /><span class="False">     222:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">cx</span><span class="f">;</span>
<a name="223" /><span class="False">     223:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">dx</span><span class="f">;</span>
<a name="224" /><span class="False">     224:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">bx</span><span class="f">;</span>
<a name="225" /><span class="False">     225:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">sp</span><span class="f">;</span>
<a name="226" /><span class="False">     226:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">bp</span><span class="f">;</span>
<a name="227" /><span class="False">     227:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">si</span><span class="f">;</span>
<a name="228" /><span class="False">     228:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">di</span><span class="f">;</span>
<a name="229" /><span class="False">     229:</span>     <span class="m">unsigned</span> <span class="m">short</span>        <span class="b">es</span><span class="f">,</span> <span class="b">__esh</span><span class="f">;</span>
<a name="230" /><span class="False">     230:</span>     <span class="m">unsigned</span> <span class="m">short</span>        <span class="b">cs</span><span class="f">,</span> <span class="b">__csh</span><span class="f">;</span>
<a name="231" /><span class="False">     231:</span>     <span class="m">unsigned</span> <span class="m">short</span>        <span class="b">ss</span><span class="f">,</span> <span class="b">__ssh</span><span class="f">;</span>
<a name="232" /><span class="False">     232:</span>     <span class="m">unsigned</span> <span class="m">short</span>        <span class="b">ds</span><span class="f">,</span> <span class="b">__dsh</span><span class="f">;</span>
<a name="233" /><span class="False">     233:</span>     <span class="m">unsigned</span> <span class="m">short</span>        <span class="b">fs</span><span class="f">,</span> <span class="b">__fsh</span><span class="f">;</span>
<a name="234" /><span class="False">     234:</span>     <span class="m">unsigned</span> <span class="m">short</span>        <span class="b">gs</span><span class="f">,</span> <span class="b">__gsh</span><span class="f">;</span>
<a name="235" /><span class="False">     235:</span>     <span class="m">unsigned</span> <span class="m">short</span>        <span class="b">ldt</span><span class="f">,</span> <span class="b">__ldth</span><span class="f">;</span>
<a name="236" /><span class="False">     236:</span>     <span class="m">unsigned</span> <span class="m">short</span>        <span class="b">trace</span><span class="f">;</span>
<a name="237" /><span class="False">     237:</span>     <span class="m">unsigned</span> <span class="m">short</span>        <span class="b">io_bitmap_base</span><span class="f">;</span>
<a name="238" /><span class="False">     238:</span> 
<a name="239" /><span class="False">     239:</span> <span class="f">}</span> <span class="b">__attribute__</span><span class="f">(</span><span class="f">(</span><span class="b">packed</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="240" /><span class="Maybe">     240:</span> <span class="f">#</span><span class="n">else</span>
<a name="241" /><span class="Maybe">     241:</span> <span class="m">struct</span> <span class="b">x86_hw_tss</span> <span class="f">{</span>
<a name="242" /><span class="Maybe">     242:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">reserved1</span><span class="f">;</span>
<a name="243" /><span class="Maybe">     243:</span>     <span class="b">u64</span>            <span class="b">sp0</span><span class="f">;</span>
<a name="244" /><span class="Maybe">     244:</span>     <span class="b">u64</span>            <span class="b">sp1</span><span class="f">;</span>
<a name="245" /><span class="Maybe">     245:</span>     <span class="b">u64</span>            <span class="b">sp2</span><span class="f">;</span>
<a name="246" /><span class="Maybe">     246:</span>     <span class="b">u64</span>            <span class="b">reserved2</span><span class="f">;</span>
<a name="247" /><span class="Maybe">     247:</span>     <span class="b">u64</span>            <span class="b">ist</span><span class="f">[</span><span class="c">7</span><span class="f">]</span><span class="f">;</span>
<a name="248" /><span class="Maybe">     248:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">reserved3</span><span class="f">;</span>
<a name="249" /><span class="Maybe">     249:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">reserved4</span><span class="f">;</span>
<a name="250" /><span class="Maybe">     250:</span>     <span class="b">u16</span>            <span class="b">reserved5</span><span class="f">;</span>
<a name="251" /><span class="Maybe">     251:</span>     <span class="b">u16</span>            <span class="b">io_bitmap_base</span><span class="f">;</span>
<a name="252" /><span class="Maybe">     252:</span> 
<a name="253" /><span class="Maybe">     253:</span> <span class="f">}</span> <span class="b">__attribute__</span><span class="f">(</span><span class="f">(</span><span class="b">packed</span><span class="f">)</span><span class="f">)</span> <a href="cpu.c_macros_ref.html#_X19fX2NhY2hlbGluZV9hbGlnbmVkXzA_"><span class="b">____cacheline_aligned</span></a><span class="f">;</span>
<a name="254" /><span class="Maybe">     254:</span> <span class="f">#</span><span class="n">endif</span>
<a name="255" /><span class="Maybe">     255:</span> 
<a name="256" /><span class="Maybe">     256:</span> <span class="k">/*</span>
<a name="257" /><span class="Maybe">     257:</span> <span class="k"> * IO-bitmap sizes:</span>
<a name="258" /><span class="Maybe">     258:</span> <span class="k"> */</span>
<a name="259" /><span class="Maybe">     259:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_SU9fQklUTUFQX0JJVFNfMA__"><span class="b">IO_BITMAP_BITS</span></a>            <span class="c">65536</span>
<a name="260" /><span class="Maybe">     260:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_SU9fQklUTUFQX0JZVEVTXzA_"><span class="b">IO_BITMAP_BYTES</span></a>            <span class="f">(</span><a href="cpu.c_macros_ref.html#_SU9fQklUTUFQX0JJVFNfMA__"><span class="b">IO_BITMAP_BITS</span></a><span class="f">/</span><span class="c">8</span><span class="f">)</span>
<a name="261" /><span class="Maybe">     261:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_SU9fQklUTUFQX0xPTkdTXzA_"><span class="b">IO_BITMAP_LONGS</span></a>            <span class="f">(</span><a href="cpu.c_macros_ref.html#_SU9fQklUTUFQX0JZVEVTXzA_"><span class="b">IO_BITMAP_BYTES</span></a><span class="f">/</span><span class="m">sizeof</span><span class="f">(</span><span class="m">long</span><span class="f">)</span><span class="f">)</span>
<a name="262" /><span class="Maybe">     262:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_SU9fQklUTUFQX09GRlNFVF8w"><span class="b">IO_BITMAP_OFFSET</span></a>        <a href="cpu.c_macros_ref.html#_b2Zmc2V0b2ZfMA__"><span class="b">offsetof</span></a><span class="f">(</span><span class="m">struct</span> <span class="b">tss_struct</span><span class="f">,</span> <span class="b">io_bitmap</span><span class="f">)</span>
<a name="263" /><span class="Maybe">     263:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_SU5WQUxJRF9JT19CSVRNQVBfT0ZGU0VUXzA_"><span class="b">INVALID_IO_BITMAP_OFFSET</span></a>    <span class="c">0x8000</span>
<a name="264" /><span class="Maybe">     264:</span> 
<a name="265" /><span class="Maybe">     265:</span> <span class="m">struct</span> <span class="b">tss_struct</span> <span class="f">{</span>
<a name="266" /><span class="Maybe">     266:</span>     <span class="k">/*</span>
<a name="267" /><span class="Maybe">     267:</span> <span class="k">     * The hardware state:</span>
<a name="268" /><span class="Maybe">     268:</span> <span class="k">     */</span>
<a name="269" /><span class="Maybe">     269:</span>     <span class="m">struct</span> <span class="b">x86_hw_tss</span>    <span class="b">x86_tss</span><span class="f">;</span>
<a name="270" /><span class="Maybe">     270:</span> 
<a name="271" /><span class="Maybe">     271:</span>     <span class="k">/*</span>
<a name="272" /><span class="Maybe">     272:</span> <span class="k">     * The extra 1 is there because the CPU will access an</span>
<a name="273" /><span class="Maybe">     273:</span> <span class="k">     * additional byte beyond the end of the IO permission</span>
<a name="274" /><span class="Maybe">     274:</span> <span class="k">     * bitmap. The extra byte must be all 1 bits, and must</span>
<a name="275" /><span class="Maybe">     275:</span> <span class="k">     * be within the limit.</span>
<a name="276" /><span class="Maybe">     276:</span> <span class="k">     */</span>
<a name="277" /><span class="Maybe">     277:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">io_bitmap</span><span class="f">[</span><a href="cpu.c_macros_ref.html#_SU9fQklUTUFQX0xPTkdTXzA_"><span class="b">IO_BITMAP_LONGS</span></a> <span class="f">+</span> <span class="c">1</span><span class="f">]</span><span class="f">;</span>
<a name="278" /><span class="Maybe">     278:</span> 
<a name="279" /><span class="Maybe">     279:</span>     <span class="k">/*</span>
<a name="280" /><span class="Maybe">     280:</span> <span class="k">     * .. and then another 0x100 bytes for the emergency kernel stack:</span>
<a name="281" /><span class="Maybe">     281:</span> <span class="k">     */</span>
<a name="282" /><span class="Maybe">     282:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">stack</span><span class="f">[</span><span class="c">64</span><span class="f">]</span><span class="f">;</span>
<a name="283" /><span class="Maybe">     283:</span> 
<a name="284" /><span class="Maybe">     284:</span> <span class="f">}</span> <a href="cpu.c_macros_ref.html#_X19fX2NhY2hlbGluZV9hbGlnbmVkXzA_"><span class="b">____cacheline_aligned</span></a><span class="f">;</span>
<a name="285" /><span class="Maybe">     285:</span> 
<a name="286" /><span class="Maybe">     286:</span> <a href="cpu.c_macros_ref.html#_REVDTEFSRV9QRVJfQ1BVX1NIQVJFRF9BTElHTkVEXzA_"><span class="b">DECLARE_PER_CPU_SHARED_ALIGNED</span></a><span class="f">(</span><span class="m">struct</span> <span class="b">tss_struct</span><span class="f">,</span> <span class="b">init_tss</span><span class="f">)</span><span class="f">;</span>
<a name="287" /><span class="Maybe">     287:</span> 
<a name="288" /><span class="Maybe">     288:</span> <span class="k">/*</span>
<a name="289" /><span class="Maybe">     289:</span> <span class="k"> * Save the original ist values for checking stack pointers during debugging</span>
<a name="290" /><span class="Maybe">     290:</span> <span class="k"> */</span>
<a name="291" /><span class="Maybe">     291:</span> <span class="m">struct</span> <span class="b">orig_ist</span> <span class="f">{</span>
<a name="292" /><span class="Maybe">     292:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">ist</span><span class="f">[</span><span class="c">7</span><span class="f">]</span><span class="f">;</span>
<a name="293" /><span class="Maybe">     293:</span> <span class="f">}</span><span class="f">;</span>
<a name="294" /><span class="Maybe">     294:</span> 
<a name="295" /><span class="Maybe">     295:</span> <span class="f">#</span><span class="n">define</span>    <a href="cpu.c_macros_noref.html#_TVhDU1JfREVGQVVMVF8w"><span class="b">MXCSR_DEFAULT</span></a>        <span class="c">0x1f80</span>
<a name="296" /><span class="Maybe">     296:</span> 
<a name="297" /><span class="Maybe">     297:</span> <span class="m">struct</span> <span class="b">i387_fsave_struct</span> <span class="f">{</span>
<a name="298" /><span class="Maybe">     298:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">cwd</span><span class="f">;</span>    <span class="k">/* FPU Control Word        */</span>
<a name="299" /><span class="Maybe">     299:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">swd</span><span class="f">;</span>    <span class="k">/* FPU Status Word        */</span>
<a name="300" /><span class="Maybe">     300:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">twd</span><span class="f">;</span>    <span class="k">/* FPU Tag Word            */</span>
<a name="301" /><span class="Maybe">     301:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">fip</span><span class="f">;</span>    <span class="k">/* FPU IP Offset        */</span>
<a name="302" /><span class="Maybe">     302:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">fcs</span><span class="f">;</span>    <span class="k">/* FPU IP Selector        */</span>
<a name="303" /><span class="Maybe">     303:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">foo</span><span class="f">;</span>    <span class="k">/* FPU Operand Pointer Offset    */</span>
<a name="304" /><span class="Maybe">     304:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">fos</span><span class="f">;</span>    <span class="k">/* FPU Operand Pointer Selector    */</span>
<a name="305" /><span class="Maybe">     305:</span> 
<a name="306" /><span class="Maybe">     306:</span>     <span class="k">/* 8*10 bytes for each FP-reg = 80 bytes:            */</span>
<a name="307" /><span class="Maybe">     307:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">st_space</span><span class="f">[</span><span class="c">20</span><span class="f">]</span><span class="f">;</span>
<a name="308" /><span class="Maybe">     308:</span> 
<a name="309" /><span class="Maybe">     309:</span>     <span class="k">/* Software status information [not touched by FSAVE ]:        */</span>
<a name="310" /><span class="Maybe">     310:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">status</span><span class="f">;</span>
<a name="311" /><span class="Maybe">     311:</span> <span class="f">}</span><span class="f">;</span>
<a name="312" /><span class="Maybe">     312:</span> 
<a name="313" /><span class="Maybe">     313:</span> <span class="m">struct</span> <span class="b">i387_fxsave_struct</span> <span class="f">{</span>
<a name="314" /><span class="Maybe">     314:</span>     <span class="b">u16</span>            <span class="b">cwd</span><span class="f">;</span> <span class="k">/* Control Word            */</span>
<a name="315" /><span class="Maybe">     315:</span>     <span class="b">u16</span>            <span class="b">swd</span><span class="f">;</span> <span class="k">/* Status Word            */</span>
<a name="316" /><span class="Maybe">     316:</span>     <span class="b">u16</span>            <span class="b">twd</span><span class="f">;</span> <span class="k">/* Tag Word            */</span>
<a name="317" /><span class="Maybe">     317:</span>     <span class="b">u16</span>            <span class="b">fop</span><span class="f">;</span> <span class="k">/* Last Instruction Opcode        */</span>
<a name="318" /><span class="Maybe">     318:</span>     <span class="m">union</span> <span class="f">{</span>
<a name="319" /><span class="Maybe">     319:</span>         <span class="m">struct</span> <span class="f">{</span>
<a name="320" /><span class="Maybe">     320:</span>             <span class="b">u64</span>    <span class="b">rip</span><span class="f">;</span> <span class="k">/* Instruction Pointer        */</span>
<a name="321" /><span class="Maybe">     321:</span>             <span class="b">u64</span>    <span class="b">rdp</span><span class="f">;</span> <span class="k">/* Data Pointer            */</span>
<a name="322" /><span class="Maybe">     322:</span>         <span class="f">}</span><span class="f">;</span>
<a name="323" /><span class="Maybe">     323:</span>         <span class="m">struct</span> <span class="f">{</span>
<a name="324" /><span class="Maybe">     324:</span>             <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>    <span class="b">fip</span><span class="f">;</span> <span class="k">/* FPU IP Offset            */</span>
<a name="325" /><span class="Maybe">     325:</span>             <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>    <span class="b">fcs</span><span class="f">;</span> <span class="k">/* FPU IP Selector            */</span>
<a name="326" /><span class="Maybe">     326:</span>             <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>    <span class="b">foo</span><span class="f">;</span> <span class="k">/* FPU Operand Offset        */</span>
<a name="327" /><span class="Maybe">     327:</span>             <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>    <span class="b">fos</span><span class="f">;</span> <span class="k">/* FPU Operand Selector        */</span>
<a name="328" /><span class="Maybe">     328:</span>         <span class="f">}</span><span class="f">;</span>
<a name="329" /><span class="Maybe">     329:</span>     <span class="f">}</span><span class="f">;</span>
<a name="330" /><span class="Maybe">     330:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">mxcsr</span><span class="f">;</span>        <span class="k">/* MXCSR Register State */</span>
<a name="331" /><span class="Maybe">     331:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">mxcsr_mask</span><span class="f">;</span>    <span class="k">/* MXCSR Mask        */</span>
<a name="332" /><span class="Maybe">     332:</span> 
<a name="333" /><span class="Maybe">     333:</span>     <span class="k">/* 8*16 bytes for each FP-reg = 128 bytes:            */</span>
<a name="334" /><span class="Maybe">     334:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">st_space</span><span class="f">[</span><span class="c">32</span><span class="f">]</span><span class="f">;</span>
<a name="335" /><span class="Maybe">     335:</span> 
<a name="336" /><span class="Maybe">     336:</span>     <span class="k">/* 16*16 bytes for each XMM-reg = 256 bytes:            */</span>
<a name="337" /><span class="Maybe">     337:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">xmm_space</span><span class="f">[</span><span class="c">64</span><span class="f">]</span><span class="f">;</span>
<a name="338" /><span class="Maybe">     338:</span> 
<a name="339" /><span class="Maybe">     339:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">padding</span><span class="f">[</span><span class="c">12</span><span class="f">]</span><span class="f">;</span>
<a name="340" /><span class="Maybe">     340:</span> 
<a name="341" /><span class="Maybe">     341:</span>     <span class="m">union</span> <span class="f">{</span>
<a name="342" /><span class="Maybe">     342:</span>         <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>        <span class="b">padding1</span><span class="f">[</span><span class="c">12</span><span class="f">]</span><span class="f">;</span>
<a name="343" /><span class="Maybe">     343:</span>         <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>        <span class="b">sw_reserved</span><span class="f">[</span><span class="c">12</span><span class="f">]</span><span class="f">;</span>
<a name="344" /><span class="Maybe">     344:</span>     <span class="f">}</span><span class="f">;</span>
<a name="345" /><span class="Maybe">     345:</span> 
<a name="346" /><span class="Maybe">     346:</span> <span class="f">}</span> <span class="b">__attribute__</span><span class="f">(</span><span class="f">(</span><span class="b">aligned</span><span class="f">(</span><span class="c">16</span><span class="f">)</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="347" /><span class="Maybe">     347:</span> 
<a name="348" /><span class="Maybe">     348:</span> <span class="m">struct</span> <span class="b">i387_soft_struct</span> <span class="f">{</span>
<a name="349" /><span class="Maybe">     349:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">cwd</span><span class="f">;</span>
<a name="350" /><span class="Maybe">     350:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">swd</span><span class="f">;</span>
<a name="351" /><span class="Maybe">     351:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">twd</span><span class="f">;</span>
<a name="352" /><span class="Maybe">     352:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">fip</span><span class="f">;</span>
<a name="353" /><span class="Maybe">     353:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">fcs</span><span class="f">;</span>
<a name="354" /><span class="Maybe">     354:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">foo</span><span class="f">;</span>
<a name="355" /><span class="Maybe">     355:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">fos</span><span class="f">;</span>
<a name="356" /><span class="Maybe">     356:</span>     <span class="k">/* 8*10 bytes for each FP-reg = 80 bytes: */</span>
<a name="357" /><span class="Maybe">     357:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">st_space</span><span class="f">[</span><span class="c">20</span><span class="f">]</span><span class="f">;</span>
<a name="358" /><span class="Maybe">     358:</span>     <span class="b">u8</span>            <span class="b">ftop</span><span class="f">;</span>
<a name="359" /><span class="Maybe">     359:</span>     <span class="b">u8</span>            <span class="b">changed</span><span class="f">;</span>
<a name="360" /><span class="Maybe">     360:</span>     <span class="b">u8</span>            <span class="b">lookahead</span><span class="f">;</span>
<a name="361" /><span class="Maybe">     361:</span>     <span class="b">u8</span>            <span class="b">no_update</span><span class="f">;</span>
<a name="362" /><span class="Maybe">     362:</span>     <span class="b">u8</span>            <span class="b">rm</span><span class="f">;</span>
<a name="363" /><span class="Maybe">     363:</span>     <span class="b">u8</span>            <span class="b">alimit</span><span class="f">;</span>
<a name="364" /><span class="Maybe">     364:</span>     <span class="m">struct</span> <span class="b">math_emu_info</span>    <span class="f">*</span><span class="b">info</span><span class="f">;</span>
<a name="365" /><span class="Maybe">     365:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a>            <span class="b">entry_eip</span><span class="f">;</span>
<a name="366" /><span class="Maybe">     366:</span> <span class="f">}</span><span class="f">;</span>
<a name="367" /><span class="Maybe">     367:</span> 
<a name="368" /><span class="Maybe">     368:</span> <span class="m">struct</span> <span class="b">ymmh_struct</span> <span class="f">{</span>
<a name="369" /><span class="Maybe">     369:</span>     <span class="k">/* 16 * 16 bytes for each YMMH-reg = 256 bytes */</span>
<a name="370" /><span class="Maybe">     370:</span>     <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a> <span class="b">ymmh_space</span><span class="f">[</span><span class="c">64</span><span class="f">]</span><span class="f">;</span>
<a name="371" /><span class="Maybe">     371:</span> <span class="f">}</span><span class="f">;</span>
<a name="372" /><span class="Maybe">     372:</span> 
<a name="373" /><span class="Maybe">     373:</span> <span class="m">struct</span> <span class="b">xsave_hdr_struct</span> <span class="f">{</span>
<a name="374" /><span class="Maybe">     374:</span>     <span class="b">u64</span> <span class="b">xstate_bv</span><span class="f">;</span>
<a name="375" /><span class="Maybe">     375:</span>     <span class="b">u64</span> <span class="b">reserved1</span><span class="f">[</span><span class="c">2</span><span class="f">]</span><span class="f">;</span>
<a name="376" /><span class="Maybe">     376:</span>     <span class="b">u64</span> <span class="b">reserved2</span><span class="f">[</span><span class="c">5</span><span class="f">]</span><span class="f">;</span>
<a name="377" /><span class="Maybe">     377:</span> <span class="f">}</span> <span class="b">__attribute__</span><span class="f">(</span><span class="f">(</span><span class="b">packed</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="378" /><span class="Maybe">     378:</span> 
<a name="379" /><span class="Maybe">     379:</span> <span class="m">struct</span> <span class="b">xsave_struct</span> <span class="f">{</span>
<a name="380" /><span class="Maybe">     380:</span>     <span class="m">struct</span> <span class="b">i387_fxsave_struct</span> <span class="b">i387</span><span class="f">;</span>
<a name="381" /><span class="Maybe">     381:</span>     <span class="m">struct</span> <span class="b">xsave_hdr_struct</span> <span class="b">xsave_hdr</span><span class="f">;</span>
<a name="382" /><span class="Maybe">     382:</span>     <span class="m">struct</span> <span class="b">ymmh_struct</span> <span class="b">ymmh</span><span class="f">;</span>
<a name="383" /><span class="Maybe">     383:</span>     <span class="k">/* new processor state extensions will go here */</span>
<a name="384" /><span class="Maybe">     384:</span> <span class="f">}</span> <span class="b">__attribute__</span> <span class="f">(</span><span class="f">(</span><span class="b">packed</span><span class="f">,</span> <span class="b">aligned</span> <span class="f">(</span><span class="c">64</span><span class="f">)</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="385" /><span class="Maybe">     385:</span> 
<a name="386" /><span class="Maybe">     386:</span> <span class="m">union</span> <span class="b">thread_xstate</span> <span class="f">{</span>
<a name="387" /><span class="Maybe">     387:</span>     <span class="m">struct</span> <span class="b">i387_fsave_struct</span>    <span class="b">fsave</span><span class="f">;</span>
<a name="388" /><span class="Maybe">     388:</span>     <span class="m">struct</span> <span class="b">i387_fxsave_struct</span>    <span class="b">fxsave</span><span class="f">;</span>
<a name="389" /><span class="Maybe">     389:</span>     <span class="m">struct</span> <span class="b">i387_soft_struct</span>        <span class="b">soft</span><span class="f">;</span>
<a name="390" /><span class="Maybe">     390:</span>     <span class="m">struct</span> <span class="b">xsave_struct</span>        <span class="b">xsave</span><span class="f">;</span>
<a name="391" /><span class="Maybe">     391:</span> <span class="f">}</span><span class="f">;</span>
<a name="392" /><span class="Maybe">     392:</span> 
<a name="393" /><span class="Maybe">     393:</span> <span class="m">struct</span> <span class="b">fpu</span> <span class="f">{</span>
<a name="394" /><span class="Maybe">     394:</span>     <span class="m">unsigned</span> <span class="m">int</span> <span class="b">last_cpu</span><span class="f">;</span>
<a name="395" /><span class="Maybe">     395:</span>     <span class="m">unsigned</span> <span class="m">int</span> <span class="b">has_fpu</span><span class="f">;</span>
<a name="396" /><span class="Maybe">     396:</span>     <span class="m">union</span> <span class="b">thread_xstate</span> <span class="f">*</span><span class="b">state</span><span class="f">;</span>
<a name="397" /><span class="Maybe">     397:</span> <span class="f">}</span><span class="f">;</span>
<a name="398" /><span class="Maybe">     398:</span> 
<a name="399" /><span class="Maybe">     399:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1g4Nl82NF8w"><span class="b">CONFIG_X86_64</span></a>
<a name="400" /><span class="Maybe">     400:</span> <a href="cpu.c_macros_ref.html#_REVDTEFSRV9QRVJfQ1BVXzA_"><span class="b">DECLARE_PER_CPU</span></a><span class="f">(</span><span class="m">struct</span> <span class="b">orig_ist</span><span class="f">,</span> <span class="b">orig_ist</span><span class="f">)</span><span class="f">;</span>
<a name="401" /><span class="Maybe">     401:</span> 
<a name="402" /><span class="Maybe">     402:</span> <span class="m">union</span> <span class="b">irq_stack_union</span> <span class="f">{</span>
<a name="403" /><span class="Maybe">     403:</span>     <span class="m">char</span> <span class="b">irq_stack</span><span class="f">[</span><a href="cpu.c_macros_ref.html#_SVJRX1NUQUNLX1NJWkVfMA__"><span class="b">IRQ_STACK_SIZE</span></a><span class="f">]</span><span class="f">;</span>
<a name="404" /><span class="Maybe">     404:</span>     <span class="k">/*</span>
<a name="405" /><span class="Maybe">     405:</span> <span class="k">     * GCC hardcodes the stack canary as %gs:40.  Since the</span>
<a name="406" /><span class="Maybe">     406:</span> <span class="k">     * irq_stack is the object at %gs:0, we reserve the bottom</span>
<a name="407" /><span class="Maybe">     407:</span> <span class="k">     * 48 bytes of the irq stack for the canary.</span>
<a name="408" /><span class="Maybe">     408:</span> <span class="k">     */</span>
<a name="409" /><span class="Maybe">     409:</span>     <span class="m">struct</span> <span class="f">{</span>
<a name="410" /><span class="Maybe">     410:</span>         <span class="m">char</span> <span class="b">gs_base</span><span class="f">[</span><span class="c">40</span><span class="f">]</span><span class="f">;</span>
<a name="411" /><span class="Maybe">     411:</span>         <span class="m">unsigned</span> <span class="m">long</span> <span class="b">stack_canary</span><span class="f">;</span>
<a name="412" /><span class="Maybe">     412:</span>     <span class="f">}</span><span class="f">;</span>
<a name="413" /><span class="Maybe">     413:</span> <span class="f">}</span><span class="f">;</span>
<a name="414" /><span class="Maybe">     414:</span> 
<a name="415" /><span class="Maybe">     415:</span> <a href="cpu.c_macros_ref.html#_REVDTEFSRV9QRVJfQ1BVX0ZJUlNUXzA_"><span class="b">DECLARE_PER_CPU_FIRST</span></a><span class="f">(</span><span class="m">union</span> <span class="b">irq_stack_union</span><span class="f">,</span> <span class="b">irq_stack_union</span><span class="f">)</span> <a href="cpu.c_macros_ref.html#_X192aXNpYmxlXzA_"><span class="b">__visible</span></a><span class="f">;</span>
<a name="416" /><span class="Maybe">     416:</span> <a href="cpu.c_macros_ref.html#_REVDTEFSRV9JTklUX1BFUl9DUFVfMA__"><span class="b">DECLARE_INIT_PER_CPU</span></a><span class="f">(</span><span class="b">irq_stack_union</span><span class="f">)</span><span class="f">;</span>
<a name="417" /><span class="Maybe">     417:</span> 
<a name="418" /><span class="Maybe">     418:</span> <a href="cpu.c_macros_ref.html#_REVDTEFSRV9QRVJfQ1BVXzA_"><span class="b">DECLARE_PER_CPU</span></a><span class="f">(</span><span class="m">char</span> <span class="f">*</span><span class="f">,</span> <span class="b">irq_stack_ptr</span><span class="f">)</span><span class="f">;</span>
<a name="419" /><span class="Maybe">     419:</span> <a href="cpu.c_macros_ref.html#_REVDTEFSRV9QRVJfQ1BVXzA_"><span class="b">DECLARE_PER_CPU</span></a><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span><span class="f">,</span> <a href="cpu.c_macros_noref.html#_aXJxX2NvdW50XzA_"><span class="b">irq_count</span></a><span class="f">)</span><span class="f">;</span>
<a name="420" /><span class="Maybe">     420:</span> <span class="m">extern</span> <a href="cpu.c_macros_ref.html#_YXNtbGlua2FnZV8w"><span class="b">asmlinkage</span></a> <span class="m">void</span> <span class="b">ignore_sysret</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="421" /><span class="False">     421:</span> <span class="f">#</span><span class="n">else</span>    <span class="k">/* X86_64 */</span>
<a name="422" /><span class="False">     422:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX0NDX1NUQUNLUFJPVEVDVE9SXzA_"><span class="b">CONFIG_CC_STACKPROTECTOR</span></a>
<a name="423" /><span class="False">     423:</span> <span class="k">/*</span>
<a name="424" /><span class="False">     424:</span> <span class="k"> * Make sure stack canary segment base is cached-aligned:</span>
<a name="425" /><span class="False">     425:</span> <span class="k"> *   &quot;For Intel Atom processors, avoid non zero segment base address</span>
<a name="426" /><span class="False">     426:</span> <span class="k"> *    that is not aligned to cache line boundary at all cost.&quot;</span>
<a name="427" /><span class="False">     427:</span> <span class="k"> * (Optim Ref Manual Assembly/Compiler Coding Rule 15.)</span>
<a name="428" /><span class="False">     428:</span> <span class="k"> */</span>
<a name="429" /><span class="False">     429:</span> <span class="m">struct</span> <span class="b">stack_canary</span> <span class="f">{</span>
<a name="430" /><span class="False">     430:</span>     <span class="m">char</span> <span class="b">__pad</span><span class="f">[</span><span class="c">20</span><span class="f">]</span><span class="f">;</span>        <span class="k">/* canary at %gs:20 */</span>
<a name="431" /><span class="False">     431:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">canary</span><span class="f">;</span>
<a name="432" /><span class="False">     432:</span> <span class="f">}</span><span class="f">;</span>
<a name="433" /><span class="False">     433:</span> <a href="cpu.c_macros_noref.html#_REVDTEFSRV9QRVJfQ1BVX0FMSUdORURfMA__"><span class="b">DECLARE_PER_CPU_ALIGNED</span></a><span class="f">(</span><span class="m">struct</span> <span class="b">stack_canary</span><span class="f">,</span> <span class="b">stack_canary</span><span class="f">)</span><span class="f">;</span>
<a name="434" /><span class="False">     434:</span> <span class="f">#</span><span class="n">endif</span>
<a name="435" /><span class="Maybe">     435:</span> <span class="f">#</span><span class="n">endif</span>    <span class="k">/* X86_64 */</span>
<a name="436" /><span class="Maybe">     436:</span> 
<a name="437" /><span class="Maybe">     437:</span> <span class="m">extern</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">xstate_size</span><span class="f">;</span>
<a name="438" /><span class="Maybe">     438:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">free_thread_xstate</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="439" /><span class="Maybe">     439:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">kmem_cache</span> <span class="f">*</span><span class="b">task_xstate_cachep</span><span class="f">;</span>
<a name="440" /><span class="Maybe">     440:</span> 
<a name="441" /><span class="Maybe">     441:</span> <span class="m">struct</span> <span class="b">perf_event</span><span class="f">;</span>
<a name="442" /><span class="Maybe">     442:</span> 
<a name="443" /><span class="Maybe">     443:</span> <span class="m">struct</span> <span class="b">thread_struct</span> <span class="f">{</span>
<a name="444" /><span class="Maybe">     444:</span>     <span class="k">/* Cached TLS descriptors: */</span>
<a name="445" /><span class="Maybe">     445:</span>     <span class="m">struct</span> <span class="b">desc_struct</span>    <span class="b">tls_array</span><span class="f">[</span><a href="cpu.c_macros_ref.html#_R0RUX0VOVFJZX1RMU19FTlRSSUVTXzA_"><span class="b">GDT_ENTRY_TLS_ENTRIES</span></a><span class="f">]</span><span class="f">;</span>
<a name="446" /><span class="Maybe">     446:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">sp0</span><span class="f">;</span>
<a name="447" /><span class="Maybe">     447:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">sp</span><span class="f">;</span>
<a name="448" /><span class="False">     448:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_X86_32</span>
<a name="449" /><span class="False">     449:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">sysenter_cs</span><span class="f">;</span>
<a name="450" /><span class="Maybe">     450:</span> <span class="f">#</span><span class="n">else</span>
<a name="451" /><span class="Maybe">     451:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">usersp</span><span class="f">;</span>    <span class="k">/* Copy from PDA */</span>
<a name="452" /><span class="Maybe">     452:</span>     <span class="m">unsigned</span> <span class="m">short</span>        <span class="b">es</span><span class="f">;</span>
<a name="453" /><span class="Maybe">     453:</span>     <span class="m">unsigned</span> <span class="m">short</span>        <span class="b">ds</span><span class="f">;</span>
<a name="454" /><span class="Maybe">     454:</span>     <span class="m">unsigned</span> <span class="m">short</span>        <span class="b">fsindex</span><span class="f">;</span>
<a name="455" /><span class="Maybe">     455:</span>     <span class="m">unsigned</span> <span class="m">short</span>        <span class="b">gsindex</span><span class="f">;</span>
<a name="456" /><span class="Maybe">     456:</span> <span class="f">#</span><span class="n">endif</span>
<a name="457" /><span class="False">     457:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_X86_32</span>
<a name="458" /><span class="False">     458:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">ip</span><span class="f">;</span>
<a name="459" /><span class="Maybe">     459:</span> <span class="f">#</span><span class="n">endif</span>
<a name="460" /><span class="Maybe">     460:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1g4Nl82NF8w"><span class="b">CONFIG_X86_64</span></a>
<a name="461" /><span class="Maybe">     461:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">fs</span><span class="f">;</span>
<a name="462" /><span class="Maybe">     462:</span> <span class="f">#</span><span class="n">endif</span>
<a name="463" /><span class="Maybe">     463:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">gs</span><span class="f">;</span>
<a name="464" /><span class="Maybe">     464:</span>     <span class="k">/* Save middle states of ptrace breakpoints */</span>
<a name="465" /><span class="Maybe">     465:</span>     <span class="m">struct</span> <span class="b">perf_event</span>    <span class="f">*</span><span class="b">ptrace_bps</span><span class="f">[</span><a href="cpu.c_macros_ref.html#_SEJQX05VTV8w"><span class="b">HBP_NUM</span></a><span class="f">]</span><span class="f">;</span>
<a name="466" /><span class="Maybe">     466:</span>     <span class="k">/* Debug status used for traps, single steps, etc... */</span>
<a name="467" /><span class="Maybe">     467:</span>     <span class="m">unsigned</span> <span class="m">long</span>           <span class="b">debugreg6</span><span class="f">;</span>
<a name="468" /><span class="Maybe">     468:</span>     <span class="k">/* Keep track of the exact dr7 value set by the user */</span>
<a name="469" /><span class="Maybe">     469:</span>     <span class="m">unsigned</span> <span class="m">long</span>           <span class="b">ptrace_dr7</span><span class="f">;</span>
<a name="470" /><span class="Maybe">     470:</span>     <span class="k">/* Fault info: */</span>
<a name="471" /><span class="Maybe">     471:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">cr2</span><span class="f">;</span>
<a name="472" /><span class="Maybe">     472:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">trap_nr</span><span class="f">;</span>
<a name="473" /><span class="Maybe">     473:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">error_code</span><span class="f">;</span>
<a name="474" /><span class="Maybe">     474:</span>     <span class="k">/* floating point and extended processor state */</span>
<a name="475" /><span class="Maybe">     475:</span>     <span class="m">struct</span> <span class="b">fpu</span>        <span class="b">fpu</span><span class="f">;</span>
<a name="476" /><span class="False">     476:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_X86_32</span>
<a name="477" /><span class="False">     477:</span>     <span class="k">/* Virtual 86 mode info */</span>
<a name="478" /><span class="False">     478:</span>     <span class="m">struct</span> <span class="b">vm86_struct</span> <a href="cpu.c_macros_ref.html#_X191c2VyXzA_"><span class="b">__user</span></a> <span class="f">*</span><span class="b">vm86_info</span><span class="f">;</span>
<a name="479" /><span class="False">     479:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">screen_bitmap</span><span class="f">;</span>
<a name="480" /><span class="False">     480:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">v86flags</span><span class="f">;</span>
<a name="481" /><span class="False">     481:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">v86mask</span><span class="f">;</span>
<a name="482" /><span class="False">     482:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">saved_sp0</span><span class="f">;</span>
<a name="483" /><span class="False">     483:</span>     <span class="m">unsigned</span> <span class="m">int</span>        <span class="b">saved_fs</span><span class="f">;</span>
<a name="484" /><span class="False">     484:</span>     <span class="m">unsigned</span> <span class="m">int</span>        <span class="b">saved_gs</span><span class="f">;</span>
<a name="485" /><span class="Maybe">     485:</span> <span class="f">#</span><span class="n">endif</span>
<a name="486" /><span class="Maybe">     486:</span>     <span class="k">/* IO permissions: */</span>
<a name="487" /><span class="Maybe">     487:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="f">*</span><span class="b">io_bitmap_ptr</span><span class="f">;</span>
<a name="488" /><span class="Maybe">     488:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">iopl</span><span class="f">;</span>
<a name="489" /><span class="Maybe">     489:</span>     <span class="k">/* Max allowed port in the bitmap, in bytes: */</span>
<a name="490" /><span class="Maybe">     490:</span>     <span class="m">unsigned</span>        <span class="b">io_bitmap_max</span><span class="f">;</span>
<a name="491" /><span class="Maybe">     491:</span>     <span class="k">/*</span>
<a name="492" /><span class="Maybe">     492:</span> <span class="k">     * fpu_counter contains the number of consecutive context switches</span>
<a name="493" /><span class="Maybe">     493:</span> <span class="k">     * that the FPU is used. If this is over a threshold, the lazy fpu</span>
<a name="494" /><span class="Maybe">     494:</span> <span class="k">     * saving becomes unlazy to save the trap. This is an unsigned char</span>
<a name="495" /><span class="Maybe">     495:</span> <span class="k">     * so that after 256 times the counter wraps and the behavior turns</span>
<a name="496" /><span class="Maybe">     496:</span> <span class="k">     * lazy again; this to deal with bursty apps that only use FPU for</span>
<a name="497" /><span class="Maybe">     497:</span> <span class="k">     * a short time</span>
<a name="498" /><span class="Maybe">     498:</span> <span class="k">     */</span>
<a name="499" /><span class="Maybe">     499:</span>     <span class="m">unsigned</span> <span class="m">char</span> <span class="b">fpu_counter</span><span class="f">;</span>
<a name="500" /><span class="Maybe">     500:</span> <span class="f">}</span><span class="f">;</span>
<a name="501" /><span class="Maybe">     501:</span> 
<a name="502" /><span class="Maybe">     502:</span> <span class="k">/*</span>
<a name="503" /><span class="Maybe">     503:</span> <span class="k"> * Set IOPL bits in EFLAGS from given mask</span>
<a name="504" /><span class="Maybe">     504:</span> <span class="k"> */</span>
<a name="505" /><span class="Maybe">     505:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">native_set_iopl_mask</span><span class="f">(</span><span class="m">unsigned</span> <span class="b">mask</span><span class="f">)</span>
<a name="506" /><span class="Maybe">     506:</span> <span class="f">{</span>
<a name="507" /><span class="False">     507:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_X86_32</span>
<a name="508" /><span class="False">     508:</span>     <span class="m">unsigned</span> <span class="m">int</span> <span class="b">reg</span><span class="f">;</span>
<a name="509" /><span class="False">     509:</span> 
<a name="510" /><span class="False">     510:</span>     <span class="m">asm</span> <span class="m">volatile</span> <span class="f">(</span><span class="e">&quot;pushfl;&quot;</span>
<a name="511" /><span class="False">     511:</span>               <span class="e">&quot;popl %0;&quot;</span>
<a name="512" /><span class="False">     512:</span>               <span class="e">&quot;andl %1, %0;&quot;</span>
<a name="513" /><span class="False">     513:</span>               <span class="e">&quot;orl %2, %0;&quot;</span>
<a name="514" /><span class="False">     514:</span>               <span class="e">&quot;pushl %0;&quot;</span>
<a name="515" /><span class="False">     515:</span>               <span class="e">&quot;popfl&quot;</span>
<a name="516" /><span class="False">     516:</span>               <span class="f">:</span> <span class="e">&quot;=&amp;r&quot;</span> <span class="f">(</span><span class="b">reg</span><span class="f">)</span>
<a name="517" /><span class="False">     517:</span>               <span class="f">:</span> <span class="e">&quot;i&quot;</span> <span class="f">(</span><span class="f">~</span><a href="cpu.c_macros_noref.html#_WDg2X0VGTEFHU19JT1BMXzA_"><span class="b">X86_EFLAGS_IOPL</span></a><span class="f">)</span><span class="f">,</span> <span class="e">&quot;r&quot;</span> <span class="f">(</span><span class="b">mask</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="518" /><span class="Maybe">     518:</span> <span class="f">#</span><span class="n">endif</span>
<a name="519" /><span class="Maybe">     519:</span> <span class="f">}</span>
<a name="520" /><span class="Maybe">     520:</span> 
<a name="521" /><span class="Maybe">     521:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span>
<a name="522" /><span class="Maybe">     522:</span> <span class="b">native_load_sp0</span><span class="f">(</span><span class="m">struct</span> <span class="b">tss_struct</span> <span class="f">*</span><span class="b">tss</span><span class="f">,</span> <span class="m">struct</span> <span class="b">thread_struct</span> <span class="f">*</span><span class="b">thread</span><span class="f">)</span>
<a name="523" /><span class="Maybe">     523:</span> <span class="f">{</span>
<a name="524" /><span class="Maybe">     524:</span>     <span class="b">tss</span><span class="f">-&gt;</span><span class="b">x86_tss</span><span class="f">.</span><span class="b">sp0</span> <span class="f">=</span> <span class="b">thread</span><span class="f">-&gt;</span><span class="b">sp0</span><span class="f">;</span>
<a name="525" /><span class="False">     525:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_X86_32</span>
<a name="526" /><span class="False">     526:</span>     <span class="k">/* Only happens when SEP is enabled, no need to test &quot;SEP&quot;arately: */</span>
<a name="527" /><span class="False">     527:</span>     <span class="m">if</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_dW5saWtlbHlfMA__"><span class="b">unlikely</span></a><span class="f">(</span><span class="b">tss</span><span class="f">-&gt;</span><span class="b">x86_tss</span><span class="f">.</span><span class="b">ss1</span> <span class="f">!=</span> <span class="b">thread</span><span class="f">-&gt;</span><span class="b">sysenter_cs</span><span class="f">)</span><span class="f">)</span> <span class="f">{</span>
<a name="528" /><span class="False">     528:</span>         <span class="b">tss</span><span class="f">-&gt;</span><span class="b">x86_tss</span><span class="f">.</span><span class="b">ss1</span> <span class="f">=</span> <span class="b">thread</span><span class="f">-&gt;</span><span class="b">sysenter_cs</span><span class="f">;</span>
<a name="529" /><span class="False">     529:</span>         <span class="b">wrmsr</span><span class="f">(</span><a href="cpu.c_macros_noref.html#_TVNSX0lBMzJfU1lTRU5URVJfQ1NfMA__"><span class="b">MSR_IA32_SYSENTER_CS</span></a><span class="f">,</span> <span class="b">thread</span><span class="f">-&gt;</span><span class="b">sysenter_cs</span><span class="f">,</span> <span class="c">0</span><span class="f">)</span><span class="f">;</span>
<a name="530" /><span class="False">     530:</span>     <span class="f">}</span>
<a name="531" /><span class="Maybe">     531:</span> <span class="f">#</span><span class="n">endif</span>
<a name="532" /><span class="Maybe">     532:</span> <span class="f">}</span>
<a name="533" /><span class="Maybe">     533:</span> 
<a name="534" /><span class="Maybe">     534:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">native_swapgs</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="535" /><span class="Maybe">     535:</span> <span class="f">{</span>
<a name="536" /><span class="Maybe">     536:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1g4Nl82NF8w"><span class="b">CONFIG_X86_64</span></a>
<a name="537" /><span class="Maybe">     537:</span>     <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><span class="e">&quot;swapgs&quot;</span> <span class="f">::</span><span class="f">:</span> <span class="e">&quot;memory&quot;</span><span class="f">)</span><span class="f">;</span>
<a name="538" /><span class="Maybe">     538:</span> <span class="f">#</span><span class="n">endif</span>
<a name="539" /><span class="Maybe">     539:</span> <span class="f">}</span>
<a name="540" /><span class="Maybe">     540:</span> 
<a name="541" /><span class="False">     541:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_PARAVIRT</span>
<a name="542" /><span class="False">     542:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">paravirt</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="543" /><span class="Maybe">     543:</span> <span class="f">#</span><span class="n">else</span>
<a name="544" /><span class="Maybe">     544:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X19jcHVpZF8w"><span class="b">__cpuid</span></a>            <span class="b">native_cpuid</span>
<a name="545" /><span class="Maybe">     545:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_cGFyYXZpcnRfZW5hYmxlZF8w"><span class="b">paravirt_enabled</span></a><span class="f">(</span><span class="f">)</span>    <span class="c">0</span>
<a name="546" /><span class="Maybe">     546:</span> 
<a name="547" /><span class="Maybe">     547:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">load_sp0</span><span class="f">(</span><span class="m">struct</span> <span class="b">tss_struct</span> <span class="f">*</span><span class="b">tss</span><span class="f">,</span>
<a name="548" /><span class="Maybe">     548:</span>                 <span class="m">struct</span> <span class="b">thread_struct</span> <span class="f">*</span><span class="b">thread</span><span class="f">)</span>
<a name="549" /><span class="Maybe">     549:</span> <span class="f">{</span>
<a name="550" /><span class="Maybe">     550:</span>     <span class="b">native_load_sp0</span><span class="f">(</span><span class="b">tss</span><span class="f">,</span> <span class="b">thread</span><span class="f">)</span><span class="f">;</span>
<a name="551" /><span class="Maybe">     551:</span> <span class="f">}</span>
<a name="552" /><span class="Maybe">     552:</span> 
<a name="553" /><span class="Maybe">     553:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_c2V0X2lvcGxfbWFza18w"><span class="b">set_iopl_mask</span></a> <span class="b">native_set_iopl_mask</span>
<a name="554" /><span class="Maybe">     554:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* CONFIG_PARAVIRT */</span>
<a name="555" /><span class="Maybe">     555:</span> 
<a name="556" /><span class="Maybe">     556:</span> <span class="k">/*</span>
<a name="557" /><span class="Maybe">     557:</span> <span class="k"> * Save the cr4 feature set we&apos;re using (ie</span>
<a name="558" /><span class="Maybe">     558:</span> <span class="k"> * Pentium 4MB enable and PPro Global page</span>
<a name="559" /><span class="Maybe">     559:</span> <span class="k"> * enable), so that any CPU&apos;s that boot up</span>
<a name="560" /><span class="Maybe">     560:</span> <span class="k"> * after us can get the correct flags.</span>
<a name="561" /><span class="Maybe">     561:</span> <span class="k"> */</span>
<a name="562" /><span class="Maybe">     562:</span> <span class="m">extern</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">mmu_cr4_features</span><span class="f">;</span>
<a name="563" /><span class="Maybe">     563:</span> <span class="m">extern</span> <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a> <span class="f">*</span><span class="b">trampoline_cr4_features</span><span class="f">;</span>
<a name="564" /><span class="Maybe">     564:</span> 
<a name="565" /><span class="Maybe">     565:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">set_in_cr4</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">mask</span><span class="f">)</span>
<a name="566" /><span class="Maybe">     566:</span> <span class="f">{</span>
<a name="567" /><span class="Maybe">     567:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">cr4</span><span class="f">;</span>
<a name="568" /><span class="Maybe">     568:</span> 
<a name="569" /><span class="Maybe">     569:</span>     <span class="b">mmu_cr4_features</span> <span class="f">|=</span> <span class="b">mask</span><span class="f">;</span>
<a name="570" /><span class="Maybe">     570:</span>     <span class="m">if</span> <span class="f">(</span><span class="b">trampoline_cr4_features</span><span class="f">)</span>
<a name="571" /><span class="Maybe">     571:</span>         <span class="f">*</span><span class="b">trampoline_cr4_features</span> <span class="f">=</span> <span class="b">mmu_cr4_features</span><span class="f">;</span>
<a name="572" /><span class="Maybe">     572:</span>     <span class="b">cr4</span> <span class="f">=</span> <span class="b">read_cr4</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="573" /><span class="Maybe">     573:</span>     <span class="b">cr4</span> <span class="f">|=</span> <span class="b">mask</span><span class="f">;</span>
<a name="574" /><span class="Maybe">     574:</span>     <span class="b">write_cr4</span><span class="f">(</span><span class="b">cr4</span><span class="f">)</span><span class="f">;</span>
<a name="575" /><span class="Maybe">     575:</span> <span class="f">}</span>
<a name="576" /><span class="Maybe">     576:</span> 
<a name="577" /><span class="Maybe">     577:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">clear_in_cr4</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">mask</span><span class="f">)</span>
<a name="578" /><span class="Maybe">     578:</span> <span class="f">{</span>
<a name="579" /><span class="Maybe">     579:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">cr4</span><span class="f">;</span>
<a name="580" /><span class="Maybe">     580:</span> 
<a name="581" /><span class="Maybe">     581:</span>     <span class="b">mmu_cr4_features</span> <span class="f">&amp;=</span> <span class="f">~</span><span class="b">mask</span><span class="f">;</span>
<a name="582" /><span class="Maybe">     582:</span>     <span class="m">if</span> <span class="f">(</span><span class="b">trampoline_cr4_features</span><span class="f">)</span>
<a name="583" /><span class="Maybe">     583:</span>         <span class="f">*</span><span class="b">trampoline_cr4_features</span> <span class="f">=</span> <span class="b">mmu_cr4_features</span><span class="f">;</span>
<a name="584" /><span class="Maybe">     584:</span>     <span class="b">cr4</span> <span class="f">=</span> <span class="b">read_cr4</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="585" /><span class="Maybe">     585:</span>     <span class="b">cr4</span> <span class="f">&amp;=</span> <span class="f">~</span><span class="b">mask</span><span class="f">;</span>
<a name="586" /><span class="Maybe">     586:</span>     <span class="b">write_cr4</span><span class="f">(</span><span class="b">cr4</span><span class="f">)</span><span class="f">;</span>
<a name="587" /><span class="Maybe">     587:</span> <span class="f">}</span>
<a name="588" /><span class="Maybe">     588:</span> 
<a name="589" /><span class="Maybe">     589:</span> <span class="m">typedef</span> <span class="m">struct</span> <span class="f">{</span>
<a name="590" /><span class="Maybe">     590:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">seg</span><span class="f">;</span>
<a name="591" /><span class="Maybe">     591:</span> <span class="f">}</span> <span class="b">mm_segment_t</span><span class="f">;</span>
<a name="592" /><span class="Maybe">     592:</span> 
<a name="593" /><span class="Maybe">     593:</span> 
<a name="594" /><span class="Maybe">     594:</span> <span class="k">/* Free all resources held by a thread. */</span>
<a name="595" /><span class="Maybe">     595:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">release_thread</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="596" /><span class="Maybe">     596:</span> 
<a name="597" /><span class="Maybe">     597:</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">get_wchan</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">p</span><span class="f">)</span><span class="f">;</span>
<a name="598" /><span class="Maybe">     598:</span> 
<a name="599" /><span class="Maybe">     599:</span> <span class="k">/*</span>
<a name="600" /><span class="Maybe">     600:</span> <span class="k"> * Generic CPUID function</span>
<a name="601" /><span class="Maybe">     601:</span> <span class="k"> * clear %ecx since some cpus (Cyrix MII) do not set or clear %ecx</span>
<a name="602" /><span class="Maybe">     602:</span> <span class="k"> * resulting in stale register contents being returned.</span>
<a name="603" /><span class="Maybe">     603:</span> <span class="k"> */</span>
<a name="604" /><span class="Maybe">     604:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">cpuid</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">op</span><span class="f">,</span>
<a name="605" /><span class="Maybe">     605:</span>              <span class="m">unsigned</span> <span class="m">int</span> <span class="f">*</span><span class="b">eax</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="f">*</span><span class="b">ebx</span><span class="f">,</span>
<a name="606" /><span class="Maybe">     606:</span>              <span class="m">unsigned</span> <span class="m">int</span> <span class="f">*</span><span class="b">ecx</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="f">*</span><span class="b">edx</span><span class="f">)</span>
<a name="607" /><span class="Maybe">     607:</span> <span class="f">{</span>
<a name="608" /><span class="Maybe">     608:</span>     <span class="f">*</span><span class="b">eax</span> <span class="f">=</span> <span class="b">op</span><span class="f">;</span>
<a name="609" /><span class="Maybe">     609:</span>     <span class="f">*</span><span class="b">ecx</span> <span class="f">=</span> <span class="c">0</span><span class="f">;</span>
<a name="610" /><span class="Maybe">     610:</span>     <a href="cpu.c_macros_ref.html#_X19jcHVpZF8w"><span class="b">__cpuid</span></a><span class="f">(</span><span class="b">eax</span><span class="f">,</span> <span class="b">ebx</span><span class="f">,</span> <span class="b">ecx</span><span class="f">,</span> <span class="b">edx</span><span class="f">)</span><span class="f">;</span>
<a name="611" /><span class="Maybe">     611:</span> <span class="f">}</span>
<a name="612" /><span class="Maybe">     612:</span> 
<a name="613" /><span class="Maybe">     613:</span> <span class="k">/* Some CPUID calls want &apos;count&apos; to be placed in ecx */</span>
<a name="614" /><span class="Maybe">     614:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">cpuid_count</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">op</span><span class="f">,</span> <span class="m">int</span> <span class="b">count</span><span class="f">,</span>
<a name="615" /><span class="Maybe">     615:</span>                    <span class="m">unsigned</span> <span class="m">int</span> <span class="f">*</span><span class="b">eax</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="f">*</span><span class="b">ebx</span><span class="f">,</span>
<a name="616" /><span class="Maybe">     616:</span>                    <span class="m">unsigned</span> <span class="m">int</span> <span class="f">*</span><span class="b">ecx</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="f">*</span><span class="b">edx</span><span class="f">)</span>
<a name="617" /><span class="Maybe">     617:</span> <span class="f">{</span>
<a name="618" /><span class="Maybe">     618:</span>     <span class="f">*</span><span class="b">eax</span> <span class="f">=</span> <span class="b">op</span><span class="f">;</span>
<a name="619" /><span class="Maybe">     619:</span>     <span class="f">*</span><span class="b">ecx</span> <span class="f">=</span> <span class="b">count</span><span class="f">;</span>
<a name="620" /><span class="Maybe">     620:</span>     <a href="cpu.c_macros_ref.html#_X19jcHVpZF8w"><span class="b">__cpuid</span></a><span class="f">(</span><span class="b">eax</span><span class="f">,</span> <span class="b">ebx</span><span class="f">,</span> <span class="b">ecx</span><span class="f">,</span> <span class="b">edx</span><span class="f">)</span><span class="f">;</span>
<a name="621" /><span class="Maybe">     621:</span> <span class="f">}</span>
<a name="622" /><span class="Maybe">     622:</span> 
<a name="623" /><span class="Maybe">     623:</span> <span class="k">/*</span>
<a name="624" /><span class="Maybe">     624:</span> <span class="k"> * CPUID functions returning a single datum</span>
<a name="625" /><span class="Maybe">     625:</span> <span class="k"> */</span>
<a name="626" /><span class="Maybe">     626:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">cpuid_eax</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">op</span><span class="f">)</span>
<a name="627" /><span class="Maybe">     627:</span> <span class="f">{</span>
<a name="628" /><span class="Maybe">     628:</span>     <span class="m">unsigned</span> <span class="m">int</span> <span class="b">eax</span><span class="f">,</span> <span class="b">ebx</span><span class="f">,</span> <span class="b">ecx</span><span class="f">,</span> <span class="b">edx</span><span class="f">;</span>
<a name="629" /><span class="Maybe">     629:</span> 
<a name="630" /><span class="Maybe">     630:</span>     <span class="b">cpuid</span><span class="f">(</span><span class="b">op</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">eax</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">ebx</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">ecx</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">edx</span><span class="f">)</span><span class="f">;</span>
<a name="631" /><span class="Maybe">     631:</span> 
<a name="632" /><span class="Maybe">     632:</span>     <span class="m">return</span> <span class="b">eax</span><span class="f">;</span>
<a name="633" /><span class="Maybe">     633:</span> <span class="f">}</span>
<a name="634" /><span class="Maybe">     634:</span> 
<a name="635" /><span class="Maybe">     635:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">cpuid_ebx</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">op</span><span class="f">)</span>
<a name="636" /><span class="Maybe">     636:</span> <span class="f">{</span>
<a name="637" /><span class="Maybe">     637:</span>     <span class="m">unsigned</span> <span class="m">int</span> <span class="b">eax</span><span class="f">,</span> <span class="b">ebx</span><span class="f">,</span> <span class="b">ecx</span><span class="f">,</span> <span class="b">edx</span><span class="f">;</span>
<a name="638" /><span class="Maybe">     638:</span> 
<a name="639" /><span class="Maybe">     639:</span>     <span class="b">cpuid</span><span class="f">(</span><span class="b">op</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">eax</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">ebx</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">ecx</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">edx</span><span class="f">)</span><span class="f">;</span>
<a name="640" /><span class="Maybe">     640:</span> 
<a name="641" /><span class="Maybe">     641:</span>     <span class="m">return</span> <span class="b">ebx</span><span class="f">;</span>
<a name="642" /><span class="Maybe">     642:</span> <span class="f">}</span>
<a name="643" /><span class="Maybe">     643:</span> 
<a name="644" /><span class="Maybe">     644:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">cpuid_ecx</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">op</span><span class="f">)</span>
<a name="645" /><span class="Maybe">     645:</span> <span class="f">{</span>
<a name="646" /><span class="Maybe">     646:</span>     <span class="m">unsigned</span> <span class="m">int</span> <span class="b">eax</span><span class="f">,</span> <span class="b">ebx</span><span class="f">,</span> <span class="b">ecx</span><span class="f">,</span> <span class="b">edx</span><span class="f">;</span>
<a name="647" /><span class="Maybe">     647:</span> 
<a name="648" /><span class="Maybe">     648:</span>     <span class="b">cpuid</span><span class="f">(</span><span class="b">op</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">eax</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">ebx</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">ecx</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">edx</span><span class="f">)</span><span class="f">;</span>
<a name="649" /><span class="Maybe">     649:</span> 
<a name="650" /><span class="Maybe">     650:</span>     <span class="m">return</span> <span class="b">ecx</span><span class="f">;</span>
<a name="651" /><span class="Maybe">     651:</span> <span class="f">}</span>
<a name="652" /><span class="Maybe">     652:</span> 
<a name="653" /><span class="Maybe">     653:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">cpuid_edx</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">op</span><span class="f">)</span>
<a name="654" /><span class="Maybe">     654:</span> <span class="f">{</span>
<a name="655" /><span class="Maybe">     655:</span>     <span class="m">unsigned</span> <span class="m">int</span> <span class="b">eax</span><span class="f">,</span> <span class="b">ebx</span><span class="f">,</span> <span class="b">ecx</span><span class="f">,</span> <span class="b">edx</span><span class="f">;</span>
<a name="656" /><span class="Maybe">     656:</span> 
<a name="657" /><span class="Maybe">     657:</span>     <span class="b">cpuid</span><span class="f">(</span><span class="b">op</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">eax</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">ebx</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">ecx</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">edx</span><span class="f">)</span><span class="f">;</span>
<a name="658" /><span class="Maybe">     658:</span> 
<a name="659" /><span class="Maybe">     659:</span>     <span class="m">return</span> <span class="b">edx</span><span class="f">;</span>
<a name="660" /><span class="Maybe">     660:</span> <span class="f">}</span>
<a name="661" /><span class="Maybe">     661:</span> 
<a name="662" /><span class="Maybe">     662:</span> <span class="k">/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */</span>
<a name="663" /><span class="Maybe">     663:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">rep_nop</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="664" /><span class="Maybe">     664:</span> <span class="f">{</span>
<a name="665" /><span class="Maybe">     665:</span>     <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><span class="e">&quot;rep; nop&quot;</span> <span class="f">::</span><span class="f">:</span> <span class="e">&quot;memory&quot;</span><span class="f">)</span><span class="f">;</span>
<a name="666" /><span class="Maybe">     666:</span> <span class="f">}</span>
<a name="667" /><span class="Maybe">     667:</span> 
<a name="668" /><span class="Maybe">     668:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">cpu_relax</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="669" /><span class="Maybe">     669:</span> <span class="f">{</span>
<a name="670" /><span class="Maybe">     670:</span>     <span class="b">rep_nop</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="671" /><span class="Maybe">     671:</span> <span class="f">}</span>
<a name="672" /><span class="Maybe">     672:</span> 
<a name="673" /><span class="Maybe">     673:</span> <span class="k">/* Stop speculative execution and prefetching of modified code. */</span>
<a name="674" /><span class="Maybe">     674:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">sync_core</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="675" /><span class="Maybe">     675:</span> <span class="f">{</span>
<a name="676" /><span class="Maybe">     676:</span>     <span class="m">int</span> <span class="b">tmp</span><span class="f">;</span>
<a name="677" /><span class="Maybe">     677:</span> 
<a name="678" /><span class="False">     678:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_M486</span>
<a name="679" /><span class="False">     679:</span>     <span class="k">/*</span>
<a name="680" /><span class="False">     680:</span> <span class="k">     * Do a CPUID if available, otherwise do a jump.  The jump</span>
<a name="681" /><span class="False">     681:</span> <span class="k">     * can conveniently enough be the jump around CPUID.</span>
<a name="682" /><span class="False">     682:</span> <span class="k">     */</span>
<a name="683" /><span class="False">     683:</span>     <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><span class="e">&quot;cmpl %2,%1\n\t&quot;</span>
<a name="684" /><span class="False">     684:</span>              <span class="e">&quot;jl 1f\n\t&quot;</span>
<a name="685" /><span class="False">     685:</span>              <span class="e">&quot;cpuid\n&quot;</span>
<a name="686" /><span class="False">     686:</span>              <span class="e">&quot;1:&quot;</span>
<a name="687" /><span class="False">     687:</span>              <span class="f">:</span> <span class="e">&quot;=a&quot;</span> <span class="f">(</span><span class="b">tmp</span><span class="f">)</span>
<a name="688" /><span class="False">     688:</span>              <span class="f">:</span> <span class="e">&quot;rm&quot;</span> <span class="f">(</span><span class="b">boot_cpu_data</span><span class="f">.</span><span class="b">cpuid_level</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;ri&quot;</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;0&quot;</span> <span class="f">(</span><span class="c">1</span><span class="f">)</span>
<a name="689" /><span class="False">     689:</span>              <span class="f">:</span> <span class="e">&quot;ebx&quot;</span><span class="f">,</span> <span class="e">&quot;ecx&quot;</span><span class="f">,</span> <span class="e">&quot;edx&quot;</span><span class="f">,</span> <span class="e">&quot;memory&quot;</span><span class="f">)</span><span class="f">;</span>
<a name="690" /><span class="Maybe">     690:</span> <span class="f">#</span><span class="n">else</span>
<a name="691" /><span class="Maybe">     691:</span>     <span class="k">/*</span>
<a name="692" /><span class="Maybe">     692:</span> <span class="k">     * CPUID is a barrier to speculative execution.</span>
<a name="693" /><span class="Maybe">     693:</span> <span class="k">     * Prefetched instructions are automatically</span>
<a name="694" /><span class="Maybe">     694:</span> <span class="k">     * invalidated when modified.</span>
<a name="695" /><span class="Maybe">     695:</span> <span class="k">     */</span>
<a name="696" /><span class="Maybe">     696:</span>     <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><span class="e">&quot;cpuid&quot;</span>
<a name="697" /><span class="Maybe">     697:</span>              <span class="f">:</span> <span class="e">&quot;=a&quot;</span> <span class="f">(</span><span class="b">tmp</span><span class="f">)</span>
<a name="698" /><span class="Maybe">     698:</span>              <span class="f">:</span> <span class="e">&quot;0&quot;</span> <span class="f">(</span><span class="c">1</span><span class="f">)</span>
<a name="699" /><span class="Maybe">     699:</span>              <span class="f">:</span> <span class="e">&quot;ebx&quot;</span><span class="f">,</span> <span class="e">&quot;ecx&quot;</span><span class="f">,</span> <span class="e">&quot;edx&quot;</span><span class="f">,</span> <span class="e">&quot;memory&quot;</span><span class="f">)</span><span class="f">;</span>
<a name="700" /><span class="Maybe">     700:</span> <span class="f">#</span><span class="n">endif</span>
<a name="701" /><span class="Maybe">     701:</span> <span class="f">}</span>
<a name="702" /><span class="Maybe">     702:</span> 
<a name="703" /><span class="Maybe">     703:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">__monitor</span><span class="f">(</span><span class="m">const</span> <span class="m">void</span> <span class="f">*</span><span class="b">eax</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">ecx</span><span class="f">,</span>
<a name="704" /><span class="Maybe">     704:</span>                  <span class="m">unsigned</span> <span class="m">long</span> <span class="b">edx</span><span class="f">)</span>
<a name="705" /><span class="Maybe">     705:</span> <span class="f">{</span>
<a name="706" /><span class="Maybe">     706:</span>     <span class="k">/* &quot;monitor %eax, %ecx, %edx;&quot; */</span>
<a name="707" /><span class="Maybe">     707:</span>     <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><span class="e">&quot;.byte 0x0f, 0x01, 0xc8;&quot;</span>
<a name="708" /><span class="Maybe">     708:</span>              <span class="f">::</span> <span class="e">&quot;a&quot;</span> <span class="f">(</span><span class="b">eax</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;c&quot;</span> <span class="f">(</span><span class="b">ecx</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;d&quot;</span><span class="f">(</span><span class="b">edx</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="709" /><span class="Maybe">     709:</span> <span class="f">}</span>
<a name="710" /><span class="Maybe">     710:</span> 
<a name="711" /><span class="Maybe">     711:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">__mwait</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">eax</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">ecx</span><span class="f">)</span>
<a name="712" /><span class="Maybe">     712:</span> <span class="f">{</span>
<a name="713" /><span class="Maybe">     713:</span>     <span class="k">/* &quot;mwait %eax, %ecx;&quot; */</span>
<a name="714" /><span class="Maybe">     714:</span>     <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><span class="e">&quot;.byte 0x0f, 0x01, 0xc9;&quot;</span>
<a name="715" /><span class="Maybe">     715:</span>              <span class="f">::</span> <span class="e">&quot;a&quot;</span> <span class="f">(</span><span class="b">eax</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;c&quot;</span> <span class="f">(</span><span class="b">ecx</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="716" /><span class="Maybe">     716:</span> <span class="f">}</span>
<a name="717" /><span class="Maybe">     717:</span> 
<a name="718" /><span class="Maybe">     718:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">__sti_mwait</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">eax</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">ecx</span><span class="f">)</span>
<a name="719" /><span class="Maybe">     719:</span> <span class="f">{</span>
<a name="720" /><span class="Maybe">     720:</span>     <a href="cpu.c_macros_ref.html#_dHJhY2VfaGFyZGlycXNfb25fMA__"><span class="b">trace_hardirqs_on</span></a><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="721" /><span class="Maybe">     721:</span>     <span class="k">/* &quot;mwait %eax, %ecx;&quot; */</span>
<a name="722" /><span class="Maybe">     722:</span>     <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><span class="e">&quot;sti; .byte 0x0f, 0x01, 0xc9;&quot;</span>
<a name="723" /><span class="Maybe">     723:</span>              <span class="f">::</span> <span class="e">&quot;a&quot;</span> <span class="f">(</span><span class="b">eax</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;c&quot;</span> <span class="f">(</span><span class="b">ecx</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="724" /><span class="Maybe">     724:</span> <span class="f">}</span>
<a name="725" /><span class="Maybe">     725:</span> 
<a name="726" /><span class="Maybe">     726:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">select_idle_routine</span><span class="f">(</span><span class="m">const</span> <span class="m">struct</span> <span class="b">cpuinfo_x86</span> <span class="f">*</span><span class="b">c</span><span class="f">)</span><span class="f">;</span>
<a name="727" /><span class="Maybe">     727:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">init_amd_e400_c1e_mask</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="728" /><span class="Maybe">     728:</span> 
<a name="729" /><span class="Maybe">     729:</span> <span class="m">extern</span> <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">boot_option_idle_override</span><span class="f">;</span>
<a name="730" /><span class="Maybe">     730:</span> <span class="m">extern</span> <span class="m">bool</span>            <span class="b">amd_e400_c1e_detected</span><span class="f">;</span>
<a name="731" /><span class="Maybe">     731:</span> 
<a name="732" /><span class="Maybe">     732:</span> <span class="m">enum</span> <span class="b">idle_boot_override</span> <span class="f">{</span><span class="b">IDLE_NO_OVERRIDE</span><span class="f">=</span><span class="c">0</span><span class="f">,</span> <span class="b">IDLE_HALT</span><span class="f">,</span> <span class="b">IDLE_NOMWAIT</span><span class="f">,</span>
<a name="733" /><span class="Maybe">     733:</span>              <span class="b">IDLE_POLL</span><span class="f">}</span><span class="f">;</span>
<a name="734" /><span class="Maybe">     734:</span> 
<a name="735" /><span class="Maybe">     735:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">enable_sep_cpu</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="736" /><span class="Maybe">     736:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">sysenter_setup</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="737" /><span class="Maybe">     737:</span> 
<a name="738" /><span class="Maybe">     738:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">early_trap_init</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="739" /><span class="Maybe">     739:</span> <span class="m">void</span> <span class="b">early_trap_pf_init</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="740" /><span class="Maybe">     740:</span> 
<a name="741" /><span class="Maybe">     741:</span> <span class="k">/* Defined in head.S */</span>
<a name="742" /><span class="Maybe">     742:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">desc_ptr</span>        <span class="b">early_gdt_descr</span><span class="f">;</span>
<a name="743" /><span class="Maybe">     743:</span> 
<a name="744" /><span class="Maybe">     744:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">cpu_set_gdt</span><span class="f">(</span><span class="m">int</span><span class="f">)</span><span class="f">;</span>
<a name="745" /><span class="Maybe">     745:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">switch_to_new_gdt</span><span class="f">(</span><span class="m">int</span><span class="f">)</span><span class="f">;</span>
<a name="746" /><span class="Maybe">     746:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">load_percpu_segment</span><span class="f">(</span><span class="m">int</span><span class="f">)</span><span class="f">;</span>
<a name="747" /><span class="Maybe">     747:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">cpu_init</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="748" /><span class="Maybe">     748:</span> 
<a name="749" /><span class="Maybe">     749:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">get_debugctlmsr</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="750" /><span class="Maybe">     750:</span> <span class="f">{</span>
<a name="751" /><span class="Maybe">     751:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">debugctlmsr</span> <span class="f">=</span> <span class="c">0</span><span class="f">;</span>
<a name="752" /><span class="Maybe">     752:</span> 
<a name="753" /><span class="False">     753:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1g4Nl9ERUJVR0NUTE1TUl8w"><span class="b">CONFIG_X86_DEBUGCTLMSR</span></a>
<a name="754" /><span class="False">     754:</span>     <span class="m">if</span> <span class="f">(</span><span class="b">boot_cpu_data</span><span class="f">.</span><span class="b">x86</span> <span class="f">&lt;</span> <span class="c">6</span><span class="f">)</span>
<a name="755" /><span class="False">     755:</span>         <span class="m">return</span> <span class="c">0</span><span class="f">;</span>
<a name="756" /><span class="Maybe">     756:</span> <span class="f">#</span><span class="n">endif</span>
<a name="757" /><span class="Maybe">     757:</span>     <span class="b">rdmsrl</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_TVNSX0lBMzJfREVCVUdDVExNU1JfMA__"><span class="b">MSR_IA32_DEBUGCTLMSR</span></a><span class="f">,</span> <span class="b">debugctlmsr</span><span class="f">)</span><span class="f">;</span>
<a name="758" /><span class="Maybe">     758:</span> 
<a name="759" /><span class="Maybe">     759:</span>     <span class="m">return</span> <span class="b">debugctlmsr</span><span class="f">;</span>
<a name="760" /><span class="Maybe">     760:</span> <span class="f">}</span>
<a name="761" /><span class="Maybe">     761:</span> 
<a name="762" /><span class="Maybe">     762:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">update_debugctlmsr</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">debugctlmsr</span><span class="f">)</span>
<a name="763" /><span class="Maybe">     763:</span> <span class="f">{</span>
<a name="764" /><span class="False">     764:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1g4Nl9ERUJVR0NUTE1TUl8w"><span class="b">CONFIG_X86_DEBUGCTLMSR</span></a>
<a name="765" /><span class="False">     765:</span>     <span class="m">if</span> <span class="f">(</span><span class="b">boot_cpu_data</span><span class="f">.</span><span class="b">x86</span> <span class="f">&lt;</span> <span class="c">6</span><span class="f">)</span>
<a name="766" /><span class="False">     766:</span>         <span class="m">return</span><span class="f">;</span>
<a name="767" /><span class="Maybe">     767:</span> <span class="f">#</span><span class="n">endif</span>
<a name="768" /><span class="Maybe">     768:</span>     <span class="b">wrmsrl</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_TVNSX0lBMzJfREVCVUdDVExNU1JfMA__"><span class="b">MSR_IA32_DEBUGCTLMSR</span></a><span class="f">,</span> <span class="b">debugctlmsr</span><span class="f">)</span><span class="f">;</span>
<a name="769" /><span class="Maybe">     769:</span> <span class="f">}</span>
<a name="770" /><span class="Maybe">     770:</span> 
<a name="771" /><span class="Maybe">     771:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">set_task_blockstep</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">task</span><span class="f">,</span> <span class="m">bool</span> <span class="b">on</span><span class="f">)</span><span class="f">;</span>
<a name="772" /><span class="Maybe">     772:</span> 
<a name="773" /><span class="Maybe">     773:</span> <span class="k">/*</span>
<a name="774" /><span class="Maybe">     774:</span> <span class="k"> * from system description table in BIOS. Mostly for MCA use, but</span>
<a name="775" /><span class="Maybe">     775:</span> <span class="k"> * others may find it useful:</span>
<a name="776" /><span class="Maybe">     776:</span> <span class="k"> */</span>
<a name="777" /><span class="Maybe">     777:</span> <span class="m">extern</span> <span class="m">unsigned</span> <span class="m">int</span>        <span class="b">machine_id</span><span class="f">;</span>
<a name="778" /><span class="Maybe">     778:</span> <span class="m">extern</span> <span class="m">unsigned</span> <span class="m">int</span>        <span class="b">machine_submodel_id</span><span class="f">;</span>
<a name="779" /><span class="Maybe">     779:</span> <span class="m">extern</span> <span class="m">unsigned</span> <span class="m">int</span>        <span class="b">BIOS_revision</span><span class="f">;</span>
<a name="780" /><span class="Maybe">     780:</span> 
<a name="781" /><span class="Maybe">     781:</span> <span class="k">/* Boot loader type from the setup header: */</span>
<a name="782" /><span class="Maybe">     782:</span> <span class="m">extern</span> <span class="m">int</span>            <span class="b">bootloader_type</span><span class="f">;</span>
<a name="783" /><span class="Maybe">     783:</span> <span class="m">extern</span> <span class="m">int</span>            <span class="b">bootloader_version</span><span class="f">;</span>
<a name="784" /><span class="Maybe">     784:</span> 
<a name="785" /><span class="Maybe">     785:</span> <span class="m">extern</span> <span class="m">char</span>            <span class="b">ignore_fpu_irq</span><span class="f">;</span>
<a name="786" /><span class="Maybe">     786:</span> 
<a name="787" /><span class="Maybe">     787:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_SEFWRV9BUkNIX1BJQ0tfTU1BUF9MQVlPVVRfMA__"><span class="b">HAVE_ARCH_PICK_MMAP_LAYOUT</span></a> <span class="c">1</span>
<a name="788" /><span class="Maybe">     788:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QVJDSF9IQVNfUFJFRkVUQ0hXXzA_"><span class="b">ARCH_HAS_PREFETCHW</span></a>
<a name="789" /><span class="Maybe">     789:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QVJDSF9IQVNfU1BJTkxPQ0tfUFJFRkVUQ0hfMA__"><span class="b">ARCH_HAS_SPINLOCK_PREFETCH</span></a>
<a name="790" /><span class="Maybe">     790:</span> 
<a name="791" /><span class="False">     791:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_X86_32</span>
<a name="792" /><span class="False">     792:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_ref.html#_QkFTRV9QUkVGRVRDSF8w"><span class="b">BASE_PREFETCH</span></a>        <a href="cpu.c_macros_noref.html#_QVNNX05PUDRfMA__"><span class="b">ASM_NOP4</span></a>
<a name="793" /><span class="False">     793:</span> <span class="f">#</span> <span class="n">define</span> <span class="b">ARCH_HAS_PREFETCH</span>
<a name="794" /><span class="Maybe">     794:</span> <span class="f">#</span><span class="n">else</span>
<a name="795" /><span class="Maybe">     795:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_ref.html#_QkFTRV9QUkVGRVRDSF8w"><span class="b">BASE_PREFETCH</span></a>        <span class="e">&quot;prefetcht0 (%1)&quot;</span>
<a name="796" /><span class="Maybe">     796:</span> <span class="f">#</span><span class="n">endif</span>
<a name="797" /><span class="Maybe">     797:</span> 
<a name="798" /><span class="Maybe">     798:</span> <span class="k">/*</span>
<a name="799" /><span class="Maybe">     799:</span> <span class="k"> * Prefetch instructions for Pentium III (+) and AMD Athlon (+)</span>
<a name="800" /><span class="Maybe">     800:</span> <span class="k"> *</span>
<a name="801" /><span class="Maybe">     801:</span> <span class="k"> * It&apos;s not worth to care about 3dnow prefetches for the K6</span>
<a name="802" /><span class="Maybe">     802:</span> <span class="k"> * because they are microcoded there and very slow.</span>
<a name="803" /><span class="Maybe">     803:</span> <span class="k"> */</span>
<a name="804" /><span class="Maybe">     804:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">prefetch</span><span class="f">(</span><span class="m">const</span> <span class="m">void</span> <span class="f">*</span><span class="b">x</span><span class="f">)</span>
<a name="805" /><span class="Maybe">     805:</span> <span class="f">{</span>
<a name="806" /><span class="Maybe">     806:</span>     <a href="cpu.c_macros_ref.html#_YWx0ZXJuYXRpdmVfaW5wdXRfMA__"><span class="b">alternative_input</span></a><span class="f">(</span><a href="cpu.c_macros_ref.html#_QkFTRV9QUkVGRVRDSF8w"><span class="b">BASE_PREFETCH</span></a><span class="f">,</span>
<a name="807" /><span class="Maybe">     807:</span>               <span class="e">&quot;prefetchnta (%1)&quot;</span><span class="f">,</span>
<a name="808" /><span class="Maybe">     808:</span>               <a href="cpu.c_macros_ref.html#_WDg2X0ZFQVRVUkVfWE1NXzA_"><span class="b">X86_FEATURE_XMM</span></a><span class="f">,</span>
<a name="809" /><span class="Maybe">     809:</span>               <span class="e">&quot;r&quot;</span> <span class="f">(</span><span class="b">x</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="810" /><span class="Maybe">     810:</span> <span class="f">}</span>
<a name="811" /><span class="Maybe">     811:</span> 
<a name="812" /><span class="Maybe">     812:</span> <span class="k">/*</span>
<a name="813" /><span class="Maybe">     813:</span> <span class="k"> * 3dnow prefetch to get an exclusive cache line.</span>
<a name="814" /><span class="Maybe">     814:</span> <span class="k"> * Useful for spinlocks to avoid one state transition in the</span>
<a name="815" /><span class="Maybe">     815:</span> <span class="k"> * cache coherency protocol:</span>
<a name="816" /><span class="Maybe">     816:</span> <span class="k"> */</span>
<a name="817" /><span class="Maybe">     817:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">prefetchw</span><span class="f">(</span><span class="m">const</span> <span class="m">void</span> <span class="f">*</span><span class="b">x</span><span class="f">)</span>
<a name="818" /><span class="Maybe">     818:</span> <span class="f">{</span>
<a name="819" /><span class="Maybe">     819:</span>     <a href="cpu.c_macros_ref.html#_YWx0ZXJuYXRpdmVfaW5wdXRfMA__"><span class="b">alternative_input</span></a><span class="f">(</span><a href="cpu.c_macros_ref.html#_QkFTRV9QUkVGRVRDSF8w"><span class="b">BASE_PREFETCH</span></a><span class="f">,</span>
<a name="820" /><span class="Maybe">     820:</span>               <span class="e">&quot;prefetchw (%1)&quot;</span><span class="f">,</span>
<a name="821" /><span class="Maybe">     821:</span>               <a href="cpu.c_macros_ref.html#_WDg2X0ZFQVRVUkVfM0ROT1dfMA__"><span class="b">X86_FEATURE_3DNOW</span></a><span class="f">,</span>
<a name="822" /><span class="Maybe">     822:</span>               <span class="e">&quot;r&quot;</span> <span class="f">(</span><span class="b">x</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="823" /><span class="Maybe">     823:</span> <span class="f">}</span>
<a name="824" /><span class="Maybe">     824:</span> 
<a name="825" /><span class="Maybe">     825:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">spin_lock_prefetch</span><span class="f">(</span><span class="m">const</span> <span class="m">void</span> <span class="f">*</span><span class="b">x</span><span class="f">)</span>
<a name="826" /><span class="Maybe">     826:</span> <span class="f">{</span>
<a name="827" /><span class="Maybe">     827:</span>     <span class="b">prefetchw</span><span class="f">(</span><span class="b">x</span><span class="f">)</span><span class="f">;</span>
<a name="828" /><span class="Maybe">     828:</span> <span class="f">}</span>
<a name="829" /><span class="Maybe">     829:</span> 
<a name="830" /><span class="False">     830:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_X86_32</span>
<a name="831" /><span class="False">     831:</span> <span class="k">/*</span>
<a name="832" /><span class="False">     832:</span> <span class="k"> * User space process size: 3GB (default).</span>
<a name="833" /><span class="False">     833:</span> <span class="k"> */</span>
<a name="834" /><span class="False">     834:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_VEFTS19TSVpFXzA_"><span class="b">TASK_SIZE</span></a>        <a href="cpu.c_macros_ref.html#_UEFHRV9PRkZTRVRfMA__"><span class="b">PAGE_OFFSET</span></a>
<a name="835" /><span class="False">     835:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_VEFTS19TSVpFX01BWF8w"><span class="b">TASK_SIZE_MAX</span></a>        <a href="cpu.c_macros_noref.html#_VEFTS19TSVpFXzA_"><span class="b">TASK_SIZE</span></a>
<a name="836" /><span class="False">     836:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_U1RBQ0tfVE9QXzA_"><span class="b">STACK_TOP</span></a>        <a href="cpu.c_macros_noref.html#_VEFTS19TSVpFXzA_"><span class="b">TASK_SIZE</span></a>
<a name="837" /><span class="False">     837:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_U1RBQ0tfVE9QX01BWF8w"><span class="b">STACK_TOP_MAX</span></a>        <a href="cpu.c_macros_noref.html#_U1RBQ0tfVE9QXzA_"><span class="b">STACK_TOP</span></a>
<a name="838" /><span class="False">     838:</span> 
<a name="839" /><span class="False">     839:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_SU5JVF9USFJFQURfMA__"><span class="b">INIT_THREAD</span></a>  <span class="f">{</span>                              \
<a name="840" /><span class="False">     840:</span>     <span class="f">.</span><span class="b">sp0</span>            <span class="f">=</span> <span class="m">sizeof</span><span class="f">(</span><a href="cpu.c_macros_noref.html#_aW5pdF9zdGFja18w"><span class="b">init_stack</span></a><span class="f">)</span> <span class="f">+</span> <span class="f">(</span><span class="m">long</span><span class="f">)</span><span class="f">&amp;</span><a href="cpu.c_macros_noref.html#_aW5pdF9zdGFja18w"><span class="b">init_stack</span></a><span class="f">,</span> \
<a name="841" /><span class="False">     841:</span>     <span class="f">.</span><span class="b">vm86_info</span>        <span class="f">=</span> <a href="cpu.c_macros_ref.html#_TlVMTF8w"><span class="b">NULL</span></a><span class="f">,</span>                      \
<a name="842" /><span class="False">     842:</span>     <span class="f">.</span><span class="b">sysenter_cs</span>        <span class="f">=</span> <a href="cpu.c_macros_noref.html#_X19LRVJORUxfQ1NfMA__"><span class="b">__KERNEL_CS</span></a><span class="f">,</span>                  \
<a name="843" /><span class="False">     843:</span>     <span class="f">.</span><span class="b">io_bitmap_ptr</span>        <span class="f">=</span> <a href="cpu.c_macros_ref.html#_TlVMTF8w"><span class="b">NULL</span></a><span class="f">,</span>                      \
<a name="844" /><span class="False">     844:</span> <span class="f">}</span>
<a name="845" /><span class="False">     845:</span> 
<a name="846" /><span class="False">     846:</span> <span class="k">/*</span>
<a name="847" /><span class="False">     847:</span> <span class="k"> * Note that the .io_bitmap member must be extra-big. This is because</span>
<a name="848" /><span class="False">     848:</span> <span class="k"> * the CPU will access an additional byte beyond the end of the IO</span>
<a name="849" /><span class="False">     849:</span> <span class="k"> * permission bitmap. The extra byte must be all 1 bits, and must</span>
<a name="850" /><span class="False">     850:</span> <span class="k"> * be within the limit.</span>
<a name="851" /><span class="False">     851:</span> <span class="k"> */</span>
<a name="852" /><span class="False">     852:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_SU5JVF9UU1NfMA__"><span class="b">INIT_TSS</span></a>  <span class="f">{</span>                              \
<a name="853" /><span class="False">     853:</span>     <span class="f">.</span><span class="b">x86_tss</span> <span class="f">=</span> <span class="f">{</span>                              \
<a name="854" /><span class="False">     854:</span>         <span class="f">.</span><span class="b">sp0</span>        <span class="f">=</span> <span class="m">sizeof</span><span class="f">(</span><a href="cpu.c_macros_noref.html#_aW5pdF9zdGFja18w"><span class="b">init_stack</span></a><span class="f">)</span> <span class="f">+</span> <span class="f">(</span><span class="m">long</span><span class="f">)</span><span class="f">&amp;</span><a href="cpu.c_macros_noref.html#_aW5pdF9zdGFja18w"><span class="b">init_stack</span></a><span class="f">,</span> \
<a name="855" /><span class="False">     855:</span>         <span class="f">.</span><span class="b">ss0</span>        <span class="f">=</span> <a href="cpu.c_macros_noref.html#_X19LRVJORUxfRFNfMA__"><span class="b">__KERNEL_DS</span></a><span class="f">,</span>                  \
<a name="856" /><span class="False">     856:</span>         <span class="f">.</span><span class="b">ss1</span>        <span class="f">=</span> <a href="cpu.c_macros_noref.html#_X19LRVJORUxfQ1NfMA__"><span class="b">__KERNEL_CS</span></a><span class="f">,</span>                  \
<a name="857" /><span class="False">     857:</span>         <span class="f">.</span><span class="b">io_bitmap_base</span>    <span class="f">=</span> <a href="cpu.c_macros_noref.html#_SU5WQUxJRF9JT19CSVRNQVBfT0ZGU0VUXzA_"><span class="b">INVALID_IO_BITMAP_OFFSET</span></a><span class="f">,</span>          \
<a name="858" /><span class="False">     858:</span>      <span class="f">}</span><span class="f">,</span>                                  \
<a name="859" /><span class="False">     859:</span>     <span class="f">.</span><span class="b">io_bitmap</span>        <span class="f">=</span> <span class="f">{</span> <span class="f">[</span><span class="c">0</span> <span class="f">...</span> <a href="cpu.c_macros_ref.html#_SU9fQklUTUFQX0xPTkdTXzA_"><span class="b">IO_BITMAP_LONGS</span></a><span class="f">]</span> <span class="f">=</span> <span class="f">~</span><span class="c">0</span> <span class="f">}</span><span class="f">,</span>      \
<a name="860" /><span class="False">     860:</span> <span class="f">}</span>
<a name="861" /><span class="False">     861:</span> 
<a name="862" /><span class="False">     862:</span> <span class="m">extern</span> <span class="m">unsigned</span> <span class="m">long</span> <a href="cpu.c_macros_noref.html#_dGhyZWFkX3NhdmVkX3BjXzA_"><span class="b">thread_saved_pc</span></a><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">tsk</span><span class="f">)</span><span class="f">;</span>
<a name="863" /><span class="False">     863:</span> 
<a name="864" /><span class="False">     864:</span> <span class="f">#</span><span class="n">define</span> <span class="b">THREAD_SIZE_LONGS</span>      <span class="f">(</span><a href="cpu.c_macros_ref.html#_VEhSRUFEX1NJWkVfMA__"><span class="b">THREAD_SIZE</span></a><span class="f">/</span><span class="m">sizeof</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span><span class="f">)</span><span class="f">)</span>
<a name="865" /><span class="False">     865:</span> <span class="f">#</span><span class="n">define</span> <span class="b">KSTK_TOP</span><span class="f">(</span><span class="b">info</span><span class="f">)</span>                                                 \
<a name="866" /><span class="False">     866:</span> <span class="f">(</span><span class="f">{</span>                                                                     \
<a name="867" /><span class="False">     867:</span>        <span class="m">unsigned</span> <span class="m">long</span> <span class="f">*</span><span class="b">__ptr</span> <span class="f">=</span> <span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="f">*</span><span class="f">)</span><span class="f">(</span><span class="b">info</span><span class="f">)</span><span class="f">;</span>                 \
<a name="868" /><span class="False">     868:</span>        <span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span><span class="f">)</span><span class="f">(</span><span class="f">&amp;</span><span class="b">__ptr</span><span class="f">[</span><span class="b">THREAD_SIZE_LONGS</span><span class="f">]</span><span class="f">)</span><span class="f">;</span>                     \
<a name="869" /><span class="False">     869:</span> <span class="f">}</span><span class="f">)</span>
<a name="870" /><span class="False">     870:</span> 
<a name="871" /><span class="False">     871:</span> <span class="k">/*</span>
<a name="872" /><span class="False">     872:</span> <span class="k"> * The below -8 is to reserve 8 bytes on top of the ring0 stack.</span>
<a name="873" /><span class="False">     873:</span> <span class="k"> * This is necessary to guarantee that the entire &quot;struct pt_regs&quot;</span>
<a name="874" /><span class="False">     874:</span> <span class="k"> * is accessible even if the CPU haven&apos;t stored the SS/ESP registers</span>
<a name="875" /><span class="False">     875:</span> <span class="k"> * on the stack (interrupt gate does not save these registers</span>
<a name="876" /><span class="False">     876:</span> <span class="k"> * when switching to the same priv ring).</span>
<a name="877" /><span class="False">     877:</span> <span class="k"> * Therefore beware: accessing the ss/esp fields of the</span>
<a name="878" /><span class="False">     878:</span> <span class="k"> * &quot;struct pt_regs&quot; is possible, but they may contain the</span>
<a name="879" /><span class="False">     879:</span> <span class="k"> * completely wrong values.</span>
<a name="880" /><span class="False">     880:</span> <span class="k"> */</span>
<a name="881" /><span class="False">     881:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_dGFza19wdF9yZWdzXzA_"><span class="b">task_pt_regs</span></a><span class="f">(</span><span class="b">task</span><span class="f">)</span>                                             \
<a name="882" /><span class="False">     882:</span> <span class="f">(</span><span class="f">{</span>                                                                     \
<a name="883" /><span class="False">     883:</span>        <span class="m">struct</span> <span class="b">pt_regs</span> <span class="f">*</span><span class="b">__regs__</span><span class="f">;</span>                                       \
<a name="884" /><span class="False">     884:</span>        <span class="b">__regs__</span> <span class="f">=</span> <span class="f">(</span><span class="m">struct</span> <span class="b">pt_regs</span> <span class="f">*</span><span class="f">)</span><span class="f">(</span><span class="b">KSTK_TOP</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_dGFza19zdGFja19wYWdlXzA_"><span class="b">task_stack_page</span></a><span class="f">(</span><span class="b">task</span><span class="f">)</span><span class="f">)</span><span class="f">-</span><span class="c">8</span><span class="f">)</span><span class="f">;</span> \
<a name="885" /><span class="False">     885:</span>        <span class="b">__regs__</span> <span class="f">-</span> <span class="c">1</span><span class="f">;</span>                                                   \
<a name="886" /><span class="False">     886:</span> <span class="f">}</span><span class="f">)</span>
<a name="887" /><span class="False">     887:</span> 
<a name="888" /><span class="False">     888:</span> <span class="f">#</span><span class="n">define</span> <span class="b">KSTK_ESP</span><span class="f">(</span><span class="b">task</span><span class="f">)</span>        <span class="f">(</span><a href="cpu.c_macros_noref.html#_dGFza19wdF9yZWdzXzA_"><span class="b">task_pt_regs</span></a><span class="f">(</span><span class="b">task</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">sp</span><span class="f">)</span>
<a name="889" /><span class="False">     889:</span> 
<a name="890" /><span class="Maybe">     890:</span> <span class="f">#</span><span class="n">else</span>
<a name="891" /><span class="Maybe">     891:</span> <span class="k">/*</span>
<a name="892" /><span class="Maybe">     892:</span> <span class="k"> * User space process size. 47bits minus one guard page.</span>
<a name="893" /><span class="Maybe">     893:</span> <span class="k"> */</span>
<a name="894" /><span class="Maybe">     894:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_VEFTS19TSVpFX01BWF8w"><span class="b">TASK_SIZE_MAX</span></a>    <span class="f">(</span><span class="f">(</span><span class="c">1UL</span> <span class="f">&lt;&lt;</span> <span class="c">47</span><span class="f">)</span> <span class="f">-</span> <a href="cpu.c_macros_ref.html#_UEFHRV9TSVpFXzA_"><span class="b">PAGE_SIZE</span></a><span class="f">)</span>
<a name="895" /><span class="Maybe">     895:</span> 
<a name="896" /><span class="Maybe">     896:</span> <span class="k">/* This decides where the kernel will search for a free chunk of vm</span>
<a name="897" /><span class="Maybe">     897:</span> <span class="k"> * space during mmap&apos;s.</span>
<a name="898" /><span class="Maybe">     898:</span> <span class="k"> */</span>
<a name="899" /><span class="Maybe">     899:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_SUEzMl9QQUdFX09GRlNFVF8w"><span class="b">IA32_PAGE_OFFSET</span></a>    <span class="f">(</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_Y3VycmVudF8w"><span class="b">current</span></a><span class="f">-&gt;</span><a href="cpu.c_macros_noref.html#_cGVyc29uYWxpdHlfMA__"><span class="b">personality</span></a> <span class="f">&amp;</span> <span class="b">ADDR_LIMIT_3GB</span><span class="f">)</span> <span class="f">?</span> \
<a name="900" /><span class="Maybe">     900:</span>                     <span class="c">0xc0000000</span> <span class="f">:</span> <span class="c">0xFFFFe000</span><span class="f">)</span>
<a name="901" /><span class="Maybe">     901:</span> 
<a name="902" /><span class="Maybe">     902:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_VEFTS19TSVpFXzA_"><span class="b">TASK_SIZE</span></a>        <span class="f">(</span><a href="cpu.c_macros_ref.html#_dGVzdF90aHJlYWRfZmxhZ18w"><span class="b">test_thread_flag</span></a><span class="f">(</span><a href="cpu.c_macros_noref.html#_VElGX0FERFIzMl8w"><span class="b">TIF_ADDR32</span></a><span class="f">)</span> <span class="f">?</span> \
<a name="903" /><span class="Maybe">     903:</span>                     <a href="cpu.c_macros_noref.html#_SUEzMl9QQUdFX09GRlNFVF8w"><span class="b">IA32_PAGE_OFFSET</span></a> <span class="f">:</span> <a href="cpu.c_macros_noref.html#_VEFTS19TSVpFX01BWF8w"><span class="b">TASK_SIZE_MAX</span></a><span class="f">)</span>
<a name="904" /><span class="Maybe">     904:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_VEFTS19TSVpFX09GXzA_"><span class="b">TASK_SIZE_OF</span></a><span class="f">(</span><span class="b">child</span><span class="f">)</span>    <span class="f">(</span><span class="f">(</span><span class="b">test_tsk_thread_flag</span><span class="f">(</span><span class="b">child</span><span class="f">,</span> <a href="cpu.c_macros_noref.html#_VElGX0FERFIzMl8w"><span class="b">TIF_ADDR32</span></a><span class="f">)</span><span class="f">)</span> <span class="f">?</span> \
<a name="905" /><span class="Maybe">     905:</span>                     <a href="cpu.c_macros_noref.html#_SUEzMl9QQUdFX09GRlNFVF8w"><span class="b">IA32_PAGE_OFFSET</span></a> <span class="f">:</span> <a href="cpu.c_macros_noref.html#_VEFTS19TSVpFX01BWF8w"><span class="b">TASK_SIZE_MAX</span></a><span class="f">)</span>
<a name="906" /><span class="Maybe">     906:</span> 
<a name="907" /><span class="Maybe">     907:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_U1RBQ0tfVE9QXzA_"><span class="b">STACK_TOP</span></a>        <a href="cpu.c_macros_noref.html#_VEFTS19TSVpFXzA_"><span class="b">TASK_SIZE</span></a>
<a name="908" /><span class="Maybe">     908:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_U1RBQ0tfVE9QX01BWF8w"><span class="b">STACK_TOP_MAX</span></a>        <a href="cpu.c_macros_noref.html#_VEFTS19TSVpFX01BWF8w"><span class="b">TASK_SIZE_MAX</span></a>
<a name="909" /><span class="Maybe">     909:</span> 
<a name="910" /><span class="Maybe">     910:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_SU5JVF9USFJFQURfMA__"><span class="b">INIT_THREAD</span></a>  <span class="f">{</span> \
<a name="911" /><span class="Maybe">     911:</span>     <span class="f">.</span><span class="b">sp0</span> <span class="f">=</span> <span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span><span class="f">)</span><span class="f">&amp;</span><a href="cpu.c_macros_noref.html#_aW5pdF9zdGFja18w"><span class="b">init_stack</span></a> <span class="f">+</span> <span class="m">sizeof</span><span class="f">(</span><a href="cpu.c_macros_noref.html#_aW5pdF9zdGFja18w"><span class="b">init_stack</span></a><span class="f">)</span> \
<a name="912" /><span class="Maybe">     912:</span> <span class="f">}</span>
<a name="913" /><span class="Maybe">     913:</span> 
<a name="914" /><span class="Maybe">     914:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_SU5JVF9UU1NfMA__"><span class="b">INIT_TSS</span></a>  <span class="f">{</span> \
<a name="915" /><span class="Maybe">     915:</span>     <span class="f">.</span><span class="b">x86_tss</span><span class="f">.</span><span class="b">sp0</span> <span class="f">=</span> <span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span><span class="f">)</span><span class="f">&amp;</span><a href="cpu.c_macros_noref.html#_aW5pdF9zdGFja18w"><span class="b">init_stack</span></a> <span class="f">+</span> <span class="m">sizeof</span><span class="f">(</span><a href="cpu.c_macros_noref.html#_aW5pdF9zdGFja18w"><span class="b">init_stack</span></a><span class="f">)</span> \
<a name="916" /><span class="Maybe">     916:</span> <span class="f">}</span>
<a name="917" /><span class="Maybe">     917:</span> 
<a name="918" /><span class="Maybe">     918:</span> <span class="k">/*</span>
<a name="919" /><span class="Maybe">     919:</span> <span class="k"> * Return saved PC of a blocked thread.</span>
<a name="920" /><span class="Maybe">     920:</span> <span class="k"> * What is this good for? it will be always the scheduler or ret_from_fork.</span>
<a name="921" /><span class="Maybe">     921:</span> <span class="k"> */</span>
<a name="922" /><span class="Maybe">     922:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_dGhyZWFkX3NhdmVkX3BjXzA_"><span class="b">thread_saved_pc</span></a><span class="f">(</span><span class="b">t</span><span class="f">)</span>    <span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="f">*</span><span class="f">)</span><span class="f">(</span><span class="f">(</span><span class="b">t</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">thread</span><span class="f">.</span><span class="b">sp</span> <span class="f">-</span> <span class="c">8</span><span class="f">)</span><span class="f">)</span>
<a name="923" /><span class="Maybe">     923:</span> 
<a name="924" /><span class="Maybe">     924:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_dGFza19wdF9yZWdzXzA_"><span class="b">task_pt_regs</span></a><span class="f">(</span><span class="b">tsk</span><span class="f">)</span>    <span class="f">(</span><span class="f">(</span><span class="m">struct</span> <span class="b">pt_regs</span> <span class="f">*</span><span class="f">)</span><span class="f">(</span><span class="b">tsk</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">thread</span><span class="f">.</span><span class="b">sp0</span> <span class="f">-</span> <span class="c">1</span><span class="f">)</span>
<a name="925" /><span class="Maybe">     925:</span> <span class="m">extern</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">KSTK_ESP</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">task</span><span class="f">)</span><span class="f">;</span>
<a name="926" /><span class="Maybe">     926:</span> 
<a name="927" /><span class="Maybe">     927:</span> <span class="k">/*</span>
<a name="928" /><span class="Maybe">     928:</span> <span class="k"> * User space RSP while inside the SYSCALL fast path</span>
<a name="929" /><span class="Maybe">     929:</span> <span class="k"> */</span>
<a name="930" /><span class="Maybe">     930:</span> <a href="cpu.c_macros_ref.html#_REVDTEFSRV9QRVJfQ1BVXzA_"><span class="b">DECLARE_PER_CPU</span></a><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span><span class="f">,</span> <span class="b">old_rsp</span><span class="f">)</span><span class="f">;</span>
<a name="931" /><span class="Maybe">     931:</span> 
<a name="932" /><span class="Maybe">     932:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* CONFIG_X86_64 */</span>
<a name="933" /><span class="Maybe">     933:</span> 
<a name="934" /><span class="Maybe">     934:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">start_thread</span><span class="f">(</span><span class="m">struct</span> <span class="b">pt_regs</span> <span class="f">*</span><span class="b">regs</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">new_ip</span><span class="f">,</span>
<a name="935" /><span class="Maybe">     935:</span>                            <span class="m">unsigned</span> <span class="m">long</span> <span class="b">new_sp</span><span class="f">)</span><span class="f">;</span>
<a name="936" /><span class="Maybe">     936:</span> 
<a name="937" /><span class="Maybe">     937:</span> <span class="k">/*</span>
<a name="938" /><span class="Maybe">     938:</span> <span class="k"> * This decides where the kernel will search for a free chunk of vm</span>
<a name="939" /><span class="Maybe">     939:</span> <span class="k"> * space during mmap&apos;s.</span>
<a name="940" /><span class="Maybe">     940:</span> <span class="k"> */</span>
<a name="941" /><span class="Maybe">     941:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_VEFTS19VTk1BUFBFRF9CQVNFXzA_"><span class="b">TASK_UNMAPPED_BASE</span></a>    <span class="f">(</span><a href="cpu.c_macros_noref.html#_UEFHRV9BTElHTl8w"><span class="b">PAGE_ALIGN</span></a><span class="f">(</span><a href="cpu.c_macros_noref.html#_VEFTS19TSVpFXzA_"><span class="b">TASK_SIZE</span></a> <span class="f">/</span> <span class="c">3</span><span class="f">)</span><span class="f">)</span>
<a name="942" /><span class="Maybe">     942:</span> 
<a name="943" /><span class="Maybe">     943:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_S1NUS19FSVBfMA__"><span class="b">KSTK_EIP</span></a><span class="f">(</span><span class="b">task</span><span class="f">)</span>        <span class="f">(</span><a href="cpu.c_macros_noref.html#_dGFza19wdF9yZWdzXzA_"><span class="b">task_pt_regs</span></a><span class="f">(</span><span class="b">task</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">ip</span><span class="f">)</span>
<a name="944" /><span class="Maybe">     944:</span> 
<a name="945" /><span class="Maybe">     945:</span> <span class="k">/* Get/set a process&apos; ability to use the timestamp counter instruction */</span>
<a name="946" /><span class="Maybe">     946:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_R0VUX1RTQ19DVExfMA__"><span class="b">GET_TSC_CTL</span></a><span class="f">(</span><span class="b">adr</span><span class="f">)</span>    <span class="b">get_tsc_mode</span><span class="f">(</span><span class="f">(</span><span class="b">adr</span><span class="f">)</span><span class="f">)</span>
<a name="947" /><span class="Maybe">     947:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_U0VUX1RTQ19DVExfMA__"><span class="b">SET_TSC_CTL</span></a><span class="f">(</span><span class="b">val</span><span class="f">)</span>    <span class="b">set_tsc_mode</span><span class="f">(</span><span class="f">(</span><span class="b">val</span><span class="f">)</span><span class="f">)</span>
<a name="948" /><span class="Maybe">     948:</span> 
<a name="949" /><span class="Maybe">     949:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">get_tsc_mode</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">adr</span><span class="f">)</span><span class="f">;</span>
<a name="950" /><span class="Maybe">     950:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">set_tsc_mode</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">val</span><span class="f">)</span><span class="f">;</span>
<a name="951" /><span class="Maybe">     951:</span> 
<a name="952" /><span class="Maybe">     952:</span> <span class="m">extern</span> <span class="b">u16</span> <span class="b">amd_get_nb_id</span><span class="f">(</span><span class="m">int</span> <span class="b">cpu</span><span class="f">)</span><span class="f">;</span>
<a name="953" /><span class="Maybe">     953:</span> 
<a name="954" /><span class="Maybe">     954:</span> <span class="m">static</span> <span class="m">inline</span> <span class="b">uint32_t</span> <span class="b">hypervisor_cpuid_base</span><span class="f">(</span><span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="b">sig</span><span class="f">,</span> <span class="b">uint32_t</span> <span class="b">leaves</span><span class="f">)</span>
<a name="955" /><span class="Maybe">     955:</span> <span class="f">{</span>
<a name="956" /><span class="Maybe">     956:</span>     <span class="b">uint32_t</span> <span class="b">base</span><span class="f">,</span> <span class="b">eax</span><span class="f">,</span> <span class="b">signature</span><span class="f">[</span><span class="c">3</span><span class="f">]</span><span class="f">;</span>
<a name="957" /><span class="Maybe">     957:</span> 
<a name="958" /><span class="Maybe">     958:</span>     <span class="m">for</span> <span class="f">(</span><span class="b">base</span> <span class="f">=</span> <span class="c">0x40000000</span><span class="f">;</span> <span class="b">base</span> <span class="f">&lt;</span> <span class="c">0x40010000</span><span class="f">;</span> <span class="b">base</span> <span class="f">+=</span> <span class="c">0x100</span><span class="f">)</span> <span class="f">{</span>
<a name="959" /><span class="Maybe">     959:</span>         <span class="b">cpuid</span><span class="f">(</span><span class="b">base</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">eax</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">signature</span><span class="f">[</span><span class="c">0</span><span class="f">]</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">signature</span><span class="f">[</span><span class="c">1</span><span class="f">]</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">signature</span><span class="f">[</span><span class="c">2</span><span class="f">]</span><span class="f">)</span><span class="f">;</span>
<a name="960" /><span class="Maybe">     960:</span> 
<a name="961" /><span class="Maybe">     961:</span>         <span class="m">if</span> <span class="f">(</span><span class="f">!</span><span class="b">memcmp</span><span class="f">(</span><span class="b">sig</span><span class="f">,</span> <span class="b">signature</span><span class="f">,</span> <span class="c">12</span><span class="f">)</span> <span class="f">&amp;&amp;</span>
<a name="962" /><span class="Maybe">     962:</span>             <span class="f">(</span><span class="b">leaves</span> <span class="f">==</span> <span class="c">0</span> <span class="f">||</span> <span class="f">(</span><span class="f">(</span><span class="b">eax</span> <span class="f">-</span> <span class="b">base</span><span class="f">)</span> <span class="f">&gt;=</span> <span class="b">leaves</span><span class="f">)</span><span class="f">)</span><span class="f">)</span>
<a name="963" /><span class="Maybe">     963:</span>             <span class="m">return</span> <span class="b">base</span><span class="f">;</span>
<a name="964" /><span class="Maybe">     964:</span>     <span class="f">}</span>
<a name="965" /><span class="Maybe">     965:</span> 
<a name="966" /><span class="Maybe">     966:</span>     <span class="m">return</span> <span class="c">0</span><span class="f">;</span>
<a name="967" /><span class="Maybe">     967:</span> <span class="f">}</span>
<a name="968" /><span class="Maybe">     968:</span> 
<a name="969" /><span class="Maybe">     969:</span> <span class="m">extern</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">arch_align_stack</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">sp</span><span class="f">)</span><span class="f">;</span>
<a name="970" /><span class="Maybe">     970:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">free_init_pages</span><span class="f">(</span><span class="m">char</span> <span class="f">*</span><span class="b">what</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">begin</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">end</span><span class="f">)</span><span class="f">;</span>
<a name="971" /><span class="Maybe">     971:</span> 
<a name="972" /><span class="Maybe">     972:</span> <span class="m">void</span> <span class="b">default_idle</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="973" /><span class="False">     973:</span> <span class="f">#</span><span class="n">ifdef</span>    <span class="b">CONFIG_XEN</span>
<a name="974" /><span class="False">     974:</span> <span class="m">bool</span> <a href="cpu.c_macros_noref.html#_eGVuX3NldF9kZWZhdWx0X2lkbGVfMA__"><span class="b">xen_set_default_idle</span></a><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="975" /><span class="Maybe">     975:</span> <span class="f">#</span><span class="n">else</span>
<a name="976" /><span class="Maybe">     976:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_eGVuX3NldF9kZWZhdWx0X2lkbGVfMA__"><span class="b">xen_set_default_idle</span></a> <span class="c">0</span>
<a name="977" /><span class="Maybe">     977:</span> <span class="f">#</span><span class="n">endif</span>
<a name="978" /><span class="Maybe">     978:</span> 
<a name="979" /><span class="Maybe">     979:</span> <span class="m">void</span> <span class="b">stop_this_cpu</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="b">dummy</span><span class="f">)</span><span class="f">;</span>
<a name="980" /><span class="Maybe">     980:</span> <span class="m">void</span> <span class="b">df_debug</span><span class="f">(</span><span class="m">struct</span> <span class="b">pt_regs</span> <span class="f">*</span><span class="b">regs</span><span class="f">,</span> <span class="m">long</span> <span class="b">error_code</span><span class="f">)</span><span class="f">;</span>
<a name="981" /><span class="True">     981:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* _ASM_X86_PROCESSOR_H */</span>
<a name="982" /><span class="True">     982:</span> </pre>
  </body>
</html>
